2013-10-10 18 views
5

मैं उपयोग कर रहा हूँ में प्रस्तुत नहीं हो कुछ भूखंडों: Ubuntu 12.04 64-बिट, आर 3.0.2, RStudio 0.98.312, knitr 1.5, markdown 0.6.3, mgcv1.7 -27Rstudio, knitr, Rmarkdown

मेरे पास एकाधिक कोड भाग के साथ एक रमार्कडाउन दस्तावेज़ है। एक खंड के बीच में कोड के कुछ बिट्स हैं जहां मैं एक गैम फिट करता हूं, फिट को सारांशित करता हूं और फिट प्लॉट करता हूं। समस्या यह है कि पहली साजिश आउटपुट फ़ाइल में प्रस्तुत होती है लेकिन दूसरी साजिश नहीं है। यहाँ हिस्सा से एक स्वच्छ कोड टुकड़ा है: सिवाय इसके कि उत्पादन साधनों पर निम्नलिखित गणना गूंज से पीछे साजिश बयान गूंज से सीधे चला जाता है के रूप में उम्मीद

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x)) 
summary(fit) # look at non-missing only 
plot(fit) 

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) 

mean(y[is.na(x)]) - mean(y[!is.na(x)]) 

सब कुछ बना देता है। साधन गणना का परिणाम सही ढंग से प्रस्तुत किया जाता है।

यदि मैं बाद में खंड में 7 लाइनों को एक और प्लॉट कॉल पर टिप्पणी करता हूं, तो गायब साजिश सही ढंग से प्रस्तुत की जाती है।

क्या किसी के पास कोई सुझाव है कि यहां क्या हो रहा है?

अद्यतन नीचे

सारांश - प्लॉट 2 के लिए कॉल के बाद कई लाइनों वहाँ कुछ आर कोड है कि एक निष्पादन त्रुटि (चर नहीं मिला) और कई लाइनों उत्पन्न करता है कि उसके बाद वहाँ प्लॉट 3. अगर के लिए एक कॉल है कोड त्रुटि तय की जाती है तो प्लॉट 2 प्रस्तुत किया जाता है। यदि कोड त्रुटि unfixed है और प्लॉट 3 पर कॉल टिप्पणी की है, तो प्लॉट 2 प्रस्तुत किया जाता है। समस्या अलग-अलग फिट के परिणामों को संग्रहीत करने के लिए उपयोग की जाने वाली वही चर 'फिट' पर निर्भर करती है। यदि मैं प्रत्येक फिट को एक अलग चर प्लॉट 2 को ठीक करता हूं तो ठीक है।

मुझे समझ में नहीं आता कि सफलतापूर्वक निष्पादित कोड की कई पंक्तियों के बाद किए गए परिवर्तन (स्पष्ट रूप से पीछे से) प्लॉट 2 को प्रतिपादन से रोक सकते हैं।

प्रतिलिपि प्रस्तुत करने योग्य उदाहरण:

Some text. 

```{r setup} 
require(mgcv) 

mkdata <- function(n=100) { 
    x <- rnorm(n) + 5 
    y <- x + 0.3 * rnorm(n) 
    x[sample(ceiling(n/2), ceiling(n/10))] <- NA 
    x <- x^2 
    data.frame(x, y) 
} 
``` 

Example 1 
========= 

Plot 2 fails to render. (Using the same fit object for each fit.) 

```{r example_1} 
j0 <- mkdata() 
attach(j0) 
mx <- min(x, na.rm=TRUE) 

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) # plot 1 

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) #plot 2 

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation 

# recode the missing values 
j0$x.na <- is.na(x) 
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode 
detach() 

attach(j0) 
fit <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0) # doesn't run because of error in recode 
summary(fit) # this is actually fit 2 
plot(fit) # plot 3 (this is actually fit 2) 
detach() 
``` 

Example 2 
========= 

Use separate fit objects for each fit. Plot 2 renders OK. 

```{r example_2} 
j0 <- mkdata() 
attach(j0) 
mx <- min(x, na.rm=TRUE) 

fit1 <- gam(y ~ s(x), data=j0, subset= !is.na(x)) 
summary(fit1) 
plot(fit1) # plot 1 

fit2 <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x)) 
summary(fit2) 
plot(fit2) #plot 2 

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation 

# recode the missing values 
j0$x.na <- is.na(x) 
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode 
detach() 

attach(j0) 
fit3 <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0) # doesn't run because of error in recode 
summary(fit3) 
plot(fit3) # plot 3 
detach() 
``` 

Example 3 
========= 

Revert to using the same fit object for each fit. Plot 2 renders because plot 3 is commented out. 

```{r example_3} 
j0 <- mkdata() 
attach(j0) 
mx <- min(x, na.rm=TRUE) 

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) # plot 1 

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) #plot 2 

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation 

# recode the missing values 
j0$x.na <- is.na(x) 
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode 
detach() 

attach(j0) 
fit <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0) 
summary(fit) # this is actually fit 2 
# plot(fit) # plot 3 (this is actually fit 2) 
detach() 
``` 

Example 4 
========= 

Plot 2 renders because later recode error is fixed. 

```{r example_4} 
j0 <- mkdata() 
attach(j0) 
mx <- min(x, na.rm=TRUE) 

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) # plot 1 

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x)) 
summary(fit) 
plot(fit) #plot 2 

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation 

# recode the missing values 
j0$x.na <- is.na(x) 
j0$x.c <- ifelse(j0$x.na, mx, x) # error in recode fixed 
detach() 

attach(j0) 
fit <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0) 
summary(fit) 
plot(fit) # plot 3 
detach() 
``` 

लॉग फ़ाइल:

> require(knitr); knit('reproduce.Rmd', encoding='UTF-8'); 
Loading required package: knitr 


processing file: reproduce.Rmd 
    |......               | 9% 
    ordinary text without R code 

    |............              | 18% 
label: setup 
    |..................            | 27% 
    ordinary text without R code 

    |........................           | 36% 
label: example_1 
    |..............................         | 45% 
    ordinary text without R code 

    |...................................        | 55% 
label: example_2 
    |.........................................      | 64% 
    ordinary text without R code 

    |...............................................     | 73% 
label: example_3 
    |.....................................................   | 82% 
    ordinary text without R code 

    |...........................................................  | 91% 
label: example_4 
    |.................................................................| 100% 
    ordinary text without R code 


output file: reproduce.md 

[1] "reproduce.md" 
+2

कृपया एक पुन: उत्पन्न उदाहरण पोस्ट करें। आपकी समस्या शायद आपके पास चंक विकल्प 'fig.keep' सेट के कारण है, लेकिन इस जानकारी के बिना यह पूरी तरह से अनुमान है। – mnel

+0

लॉग क्या कहता है? –

उत्तर

9

आप तथ्य यह है कि लोगों को attach() के इस्तेमाल के खिलाफ चेतावनी दिया है के बावजूद, अभी attach() का एक और शिकार कर रहे हैं। attach() के साथ स्क्रू करना बहुत आसान है। आप आप attach(j0) के बाद ऐसा किया:

j0$x.na <- is.na(x) 
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode 
बेशक

, आर वस्तु x.na नहीं मिल सकता है, क्योंकि यह कहीं भी मौजूद नहीं है। हां, यह अब j0 में है, लेकिन जब तक आप j0 को अलग नहीं करते हैं और इसे फिर से संलग्न नहीं करते हैं, तब तक यह आर के संपर्क में नहीं आ जाएगा। दूसरे शब्दों में, attach() स्वचालित रूप से रीफ्रेश नहीं होता है क्योंकि आप j0 पर अधिक चर जोड़ते हैं। तो उन्हें आसानी से ठीक है:

j0$x.c <- ifelse(j0$x.na, mx, x) 

मैं समझता हूँ कि तुम क्यों attach() उपयोग करना चाहते हैं - आप अजीब j0$ उपसर्ग हर जगह से बच सकते हैं, लेकिन आप बहुत इसके साथ सावधान रहने की जरूरत है।मैंने जिस समस्या का उल्लेख किया है, उसके अलावा, detach() भी खराब है, क्योंकि आपने यह निर्दिष्ट नहीं किया कि कौन सा वातावरण अलग करना है, और डिफ़ॉल्ट रूप से, खोज पथ पर दूसरा एक अलग है, जो आवश्यक रूप से आपके द्वारा संलग्न नहीं है, उदा। आपने खोज पथ पर अन्य पैकेज लोड कर सकते हैं। इसलिए आपको स्पष्ट होना चाहिए: detach('j0')

knitr पर वापस जाएं: यदि आप जानना चाहते हैं तो मैं क्या कर रहा हूं, यह समझा सकता हूं, लेकिन सबसे पहले, आपको यह सुनिश्चित करना होगा कि आपका कोड वास्तव में knitr पर जाने से पहले काम करता है। जैसे ही त्रुटि समाप्त हो जाती है, आपके द्वारा देखी गई अजीब घटना भी दूर जाएगी।

+0

धन्यवाद यहुई। मुझे लगता है कि मेरा प्रश्न knitr में त्रुटि-हैंडलिंग के बारे में और अधिक होने के समाप्त हो गया। आप मेरे उदाहरण से देख सकते हैं कि मुझे त्रुटि के बारे में पता था और पता था कि कोड चंक त्रुटि ठीक होने पर knitr समस्या प्रकट नहीं हुई थी। कोड का एक ही हिस्सा विभिन्न आउटपुट उत्पन्न करता है जब knitr द्वारा निष्पादित किया जाता है और जब सीधे आर में निष्पादित किया जाता है तो यह आर कोड को अधिक कठिन बना देता है और एक विशिष्ट वर्कफ़्लो (knitr को स्थानांतरित करने से पहले आर में पूरी तरह से डीबग) का तात्पर्य करता है। यह सुझाव देता है कि बुनाई कोड द्वारा अलग किए गए कोड से अलग नहीं है क्योंकि यह आदर्श रूप से हो सकता है। –

+1

डिबगिंग उद्देश्यों के लिए, आप बेहतर विकल्प 'त्रुटि = गलत' सेट करेंगे, या इसे वैश्विक स्तर पर 'opts_chunk $ set (error = FALSE) सेट करें; तो जब भी खंड में त्रुटि होती है तो 'knitr' रुक जाएगा, और आप सामान्य तरीकों का उपयोग करके कोड को डीबग करने में सक्षम होंगे जैसे 'traceback()' –

संबंधित मुद्दे