2013-10-10 22 views
5

kullanıyorum içinde oluşturulmuyor Bazı araziler: Ubuntu 12.04 64 bit, R 3.0.2, RStudio 0.98.312, knitr 1.5 , markdown 0.6.3, mgcv1.7 -27Rstudio, knitr, Rmarkdown

Birden çok kod parçası içeren bir Rmarkdown belgesine sahibim. Bir yığının ortasında, bir GAM'a uyduğum, uygunluğu özetleyen ve uygunluğu çizen bazı kodlar vardır. Sorun, ilk çizimin çıktı dosyasına işlenmesidir, ancak ikinci çizimde bulunmaz. İşte yığın bir ayıklanmış kod parçası geçerli: çıktı araçlarının üzerine aşağıdaki hesaplama yankılanan ikinci arsa açıklamasını yineleyen düz gider hariç beklendiği gibi

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)]) 

Herşey kılmaktadır. Araç hesaplamanın sonucu doğru şekilde oluşturulur. Ben öbekte 7 satır sonra başka arsa çağrısı açýklama ise

ardından eksik arsa doğru işlenir.

kimse burada neler olduğu gibi herhangi bir öneriniz var mı?

UPDATE Özeti

ALTINDA - Plot 2 çağrısının ardından Çeşitli türden Plot 3. Eğer bir arama olduğuna dair sonra bir yürütme hatası (değişken bulunmayan) ve birkaç çizgileri üreten bir R kodu vardır Kod hatası düzeltildi, sonra Çizelge 2 işlendi. Kod hatası çözülmezse ve Çizim 3 çağrısı yorumlanırsa, Çizelge 2 işlenir. Sorun, farklı uyumların sonuçlarını saklamak için kullanılan 'değişken' değişkenine bağlıdır. Her bir fitini farklı bir değişkene atarsam Çizelge 2, tamam.

başarıyla yürütülen kod birden fazla satır sonra yapılan değişiklikler (görünüşte geriye dönük) render gelen Plot 2 önleyebilir anlamıyorum.

tekrarlanabilir örnek:

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() 
``` 

günlük dosyası:

> 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

bir tekrarlanabilir örnek gönderin. Senin sorunun öbek seçeneği 'fig.keep' kümesine sahip ne muhtemelen, ama bu bilgilerden herhangi olmadan bu tamamen varsayımları olduğunu. – mnel

+0

Günlük ne diyor? –

cevap

9

İnsanların attach() kullanımına karşı uyarıda olmasına rağmen attach() sadece bir başka kurban vardır. attach() ile karıştırmak çok kolay. Sen attach(j0) sonra bu yaptı: her yerde var olmadığından

Tabii
j0$x.na <- is.na(x) 
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode 

R nesnesi x.na bulamıyorum. Evet, j0 şimdi, ancak j0'u ayırıp yeniden iliştirmediğiniz sürece R'ye maruz kalmayacak. Başka bir deyişle, j0'a daha fazla değişken ekledikçe, attach() kendini otomatik olarak yenilemez. Yani basit bir düzeltme geçerli:

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

Eğer attach() kullanmak istediğiniz anlıyorum - her yerde garip j0$ öneki önlemek, ancak onunla çok dikkatli olmak gerekir.Bahsettiğim problemin yanı sıra, detach() sen ayırmak için hangi ortam belirtmedi ve varsayılan olarak, arama yolunda ikincisi Eğer bağlı bir örneğin ille değil olan müstakil olduğu için, aynı zamanda kötü Arama yoluna başka paketler yüklemiş olabilirsiniz. Bu nedenle açık olmalısınız: detach('j0').

knitr'a geri dön: Bilmek istiyorsanız, neler olduğunu açıklayabilirim, ancak öncelikle kodunuzun gerçekten knitr'a geçmeden önce çalıştığından emin olmanız gerekir. Hata ortadan kalktığında, gözlemlediğiniz garip olay da gider.

+0

Teşekkürler Yihui. Sanırım sorum, knitr'de hata işleme hakkında daha fazla olmaktan çıktı. Ben hata farkındaydı ve kod yığın hata düzeltildi zaman knitr sorun görünmüyor biliyordu benim örnekten görebilirsiniz. Aynı kod parçası, knitr tarafından yürütüldüğünde ve doğrudan R'de yürütüldüğünde farklı çıktılar üretir. Bu, R kodunun hata ayıklamasını daha zor hale getirir ve belirli bir iş akışını (knitr'ye aktarmadan önce R'de tamamen hata ayıklama) ima eder. Knitr'in, ideal olarak olabileceği gibi yürüttüğü koddan izole edilmediği anlamına gelir. –

+1

Hata ayıklama amacıyla, daha iyi global 'opts_chunk $ seti (hata = YANLIŞ)' öbek seçeneği 'hatası = FALSE ayarlamak veya ayarlamak istiyorum; Sonra '') (hata parçalar halinde oluştuğunda knitr' duracak ve siz traceback 'gibi olağan yöntemler kullanarak kod hata ayıklama mümkün olacak –