2015-10-21 11 views
9

लक्ष्य

मैं अपने पिछले सभी हिस्सों पर हिस्सों पर निर्भर करके डेटा विश्लेषण पुन: उत्पन्न करना चाहता हूं। इसलिए, यदि 3 भाग हैं और मैं पहले खंड में कुछ बदलता हूं तो बाद के 2 हिस्सों को फिर से चलाने चाहिए ताकि वे आउटपुट में किए गए परिवर्तन को प्रतिबिंबित कर सकें। मैं इस स्थिति को दस्तावेज़ के शीर्ष पर वैश्विक खंड विकल्पों में जोड़ना चाहता हूं ताकि मुझे dependson कई बार उपयोग न करना पड़े। अगर यह संशोधित नहीं है और cache=TRUEकोड भाग बनाने के लिए knitr/rmarkdown में पिछले सभी हिस्सों पर निर्भर कैसे करें?

समस्याएं

एक हिस्सा के आउटपुट नहीं बदलते। कोड युक्त मात्रा के लिए, मैं उन सब को पिछले अभियानों दस्तावेज़ के शीर्ष पर निम्नलिखित के प्रयोग पर भरोसेमंद बना सकते हैं:

```{r setup, echo=FALSE} 
# set global chunk options: 
library(knitr) 
opts_chunk$set(cache=TRUE, autodep = TRUE) 
dep_auto() 
``` 

यदि उपरोक्त मात्रा के किसी भी बदल गया है, बाद के सभी हिस्सा दोबारा चला रहे हैं। लेकिन अगर मैं आर स्क्रिप्ट पढ़ने के लिए भागों में source() का उपयोग करता हूं तो यह काम नहीं करता है। अगर मैं 1 2 मात्रा में कोई परिवर्तन तीसरा हिस्सा knit टिंग के बाद सही उत्पादन देता है, अब

--- 
title: "Untitled" 
output: html_document 
--- 
```{r setup, echo=FALSE} 
# set global chunk options: 
library(knitr) 
opts_chunk$set(cache=TRUE, autodep = TRUE) 
dep_auto() 
``` 


# Create Data 
```{r} 
#source("data1.R") 
x <- data.frame(col1 = 4:10, col2 = 6:12) 
x 
``` 

# Summaries 
```{r} 
#source("data2.R") 

median1.of.x <- sapply(x, function(x) median(x)-1) 

sd.of.x <- sapply(x, sd) 

plus.of.x <- sapply(x, function(x) mean(x)+1) 

jj <- rbind(plus.of.x, sd.of.x, median1.of.x) 

``` 

```{r} 
jj 
``` 

: के बाद एक उदाहरण दस्तावेज है। लेकिन अगर इसके बजाय मैंने पहले खंड का कोड एक स्रोत फ़ाइल data1.R में रखा है और दूसरी चंक फाइल data2.R में है, तो ग्लोबल चंक विकल्पों को पहले जैसा ही रखा जाए, अगर मैं स्रोत फ़ाइलों में कोई बदलाव करता हूं तो वे तीसरे हिस्से के आउटपुट में सही ढंग से दिखाई नहीं दे रहे हैं। उदाहरण के लिए, x <- data.frame(col1 = 5:11, col2 = 6:12) के लिए बदल रहा x उपज चाहिए:

> jj 
       col1  col2 
plus.of.x 9.000000 10.000000 
sd.of.x  2.160247 2.160247 
median1.of.x 8.000000 9.000000 

लेकिन source() के उपयोग के रूप में, ऊपर चर्चा की knitr दस्तावेज़ रिपोर्ट के साथ:

jj 
##    col1  col2 
## mean.of.x 5.000000 9.000000 
## sd.of.x 2.160247 2.160247 
## minus.of.x 6.000000 10.000000 

क्या सेटिंग्स मैं knitr में source उपयोग करने के लिए बदलने की जरूरत है सही ढंग से दस्तावेज़?

+0

जब आप 'source' विधि का उपयोग करें, आप' x <बाहर टिप्पणी कर रहे हैं - data.frame() 'लाइन, सही है? – rawr

+1

Knitr ऐसा होने के लिए आपको आवश्यक घोषणात्मक वर्कफ़्लो के लिए बहुत उपयुक्त नहीं है। मैं बनाने और मेकफ़ाइल बनाने की सलाह दूंगा, या यदि आप आर के भीतर पूरी तरह से रहना चाहते हैं, तो उत्कृष्ट [रीमेक पैकेज] (https://github.com/richfitz/remake) – Ben

+0

@rawr हां, मैं केवल 'स्रोत' कमांड रखता हूं और अन्य सभी को टिप्पणी करें। –

उत्तर

12

जब आप source() का उपयोग करते हैं, knitr इससे उत्पन्न होने वाली संभावित वस्तुओं का विश्लेषण करने में असमर्थ है; knitr कोड भाग के बीच निर्भरताओं का विश्लेषण करने के लिए पूर्ण स्रोत कोड देखने में सक्षम होना चाहिए।

  1. बताएँ दूसरा हिस्सा है कि यह x का मूल्य का उपयोग करता है एक मनमाना हिस्सा विकल्प जोड़कर x के मूल्य पर निर्भर करता है, उदाहरण के लिए: वहाँ अपनी समस्या को हल करने के लिए दो दृष्टिकोण हैं ```{r cache.extra = x}; फिर जब भी x परिवर्तन, इस कोड खंड का कैश स्वचालित रूप से अमान्य हो जाएगा (more info);
  2. knitr पूर्ण स्रोत कोड देखें; आप स्रोत कोड को चंक विकल्प code के माध्यम से कोड कोड में पास कर सकते हैं, उदा। ```{r code = readLines('data1.R')} (data2.R के लिए समान); तो dep_auto()x को पहले खंड से बनाया गया था, और दूसरे खंड में उपयोग किया जाने वाला पता लगाने में सक्षम होना चाहिए, इसलिए दूसरा खंड पहले खंड पर निर्भर होना चाहिए।
+0

आपको बहुत धन्यवाद, यहुई। आम तौर पर, डेटा विश्लेषण परियोजना से संपर्क करने के लिए आपकी सलाह क्या होगी? डेटा एकत्र करने/बनाने के लिए अनुशंसित 'स्रोत' का उपयोग कर रहा है? –

+1

एक तीसरा दृष्टिकोण 'read_chunk ('data1.R') 'का उपयोग कर रहा है, [उदाहरण 113] (https://github.com/yihui/knitr-examples/blob/master/113-externization.Rmd)? – Ben

+2

@umairdurrani मेरे पास सामान्य सलाह नहीं है लेकिन यदि आप कुछ आर कोड को अलग आर स्क्रिप्ट में रखना चाहते हैं, तो आप या तो उल्लेख किए गए 'कोड' विकल्प का उपयोग कर सकते हैं, या 'read_chunk() 'के रूप में उल्लेख किया गया है (आप करेंगे कोड भाग लेबल करना होगा)। 'स्रोत()' सामान्य रूप से ठीक है, और मैं अन्य मामलों के बारे में नहीं सोच सकता जिसमें यह समस्याग्रस्त हो सकता है। –

0

मुझे लगता है कि, डिफ़ॉल्ट रूप से, भाग पिछले हिस्सों पर निर्भर करते हैं, और लेखक प्रत्येक खंड को उसी माहौल से शुरू करने की कोशिश करने के लिए बहुत लंबा समय लगाते हैं, जो कि अंतिम समाप्त होता है (हालांकि इसे खराब करने के कई तरीके हैं , जैसे कैशिंग के साथ फाइलों को सोर्स करना चालू है ...) मैं सिंटैक्स को याद नहीं कर सकता, लेकिन आप बाहरी दस्तावेजों में बुनाई भाग शामिल कर सकते हैं। लेबल का पुन: उपयोग करके फ़ंक्शन-जैसी तरीके से उसी दस्तावेज़ में knitr हिस्सों का पुन: उपयोग करने के लिए एक चाल भी है, और आप इससे कुछ गैर रेखीय निर्भरता बनाने में सक्षम हो सकते हैं। लेकिन जब आप कैशिंग नहीं चाहते हैं तो कैश को गलत क्यों सेट करें? सोर्सिंग एक बुरा विचार की तरह प्रतीत होता है लेकिन मैं अपनी अंगुली क्यों नहीं डाल सकता। मैं knitr वर्कफ़्लो रैखिक बना देता हूं और कार्यों में तर्क डालता हूं, और कैशिंग बंद कर देता हूं यदि एक ही फ़ंक्शन कॉल एक ही इनपुट पैरामीटर के साथ अलग-अलग चीज़ों को वापस कर सकता है।

एक और चाल जो आपके लिए उपयोगी हो सकती है हाल ही में इनपुट पैरामीटर का उपयोग करके दस्तावेज़ को बुनाई करने की क्षमता जोड़ा गया है। यह संभवतः आपके बुनाई दस्तावेज़ से कुछ तर्क निकाल सकता है, जो मुझे लगता है कि आपकी समस्याओं का टालने योग्य जड़ है।

+0

'कैश = गलत' ठीक है लेकिन कम्प्यूटेशनल गहन भाग के लिए यह वास्तव में एक बुरा विचार है। यदि आप एकाधिक दस्तावेज़ों में एक ही हिस्से का उपयोग करना चाहते हैं तो 'स्रोत' का उपयोग करना उपयोगी है। बुनाई में कोड बाहरीकरण संभव है लेकिन इसके लिए सभी हिस्सों का उपयोग करने की आवश्यकता है जो परस्पर निर्भर हैं। यही कारण है कि 'स्रोत' एक बेहतर विकल्प है। शायद डेटा पढ़ने के चरण को पहले खंड में स्पष्ट रूप से परिभाषित किया जाना चाहिए। –

+1

मुझे लगता है कि आपका दूसरा विकल्प एक अलग कैशिंग तंत्र का उपयोग कर रहा है। मुझे आर कैश पसंद है। मुझे पता है कि ऐसा लगता है कि बुनाई जो भी आप चाहते हैं उसे करने में सक्षम होना चाहिए, लेकिन, इस माध्यम से होने के कारण, मुझे यह अच्छा लगता है कि बुनाई डॉक्टर को बहुत सरल रखें और तर्क को वास्तविक प्रोग्रामिंग भाषा में प्राप्त करें, उदाहरण के लिए आर! –

0

मैंने पाया कि यह काम करता है (1.17 knitr):

<<..., dependson=all_labels()>>= 
... 
@ 
संबंधित मुद्दे