2013-04-04 32 views
1

下面的簡單test.Rmd knitr文件不同的行爲 「LS()」,這取決於高速緩存= T或高速緩存= F在knitr RMD文件

```{r} 
opts_chunk$set(cache=TRUE) 
``` 

```{r} 
x <- 1 
``` 

```{r} 
x 
ls() 
``` 

從Unix外殼與處理時:

R -e 'library(knitr) ; knit("test.Rmd")' 
pandoc -s -f markdown -t latex test.md -o test.tex 
pdflatex test.tex 

產生具有以下輸出pdf文件(檢驗.pdf):

x <- 1 

x 

## [1] 1 

ls() 

## character(0) 

即,最後一個碼塊的輸出顯示冷杉st x的內容,而ls()調用不顯示工作區中存在名爲x的對象。如果我通過刪除第一個代碼塊來禁用cache,則ls()將顯示爲x,正如我預料的那樣。在使用opts_chunk$set(cache=TRUE)時,我無法從文檔中找出ls()這種行爲的原因。有人可以向我解釋爲什麼會發生這種情況,我怎麼能有ls()行爲與緩存和沒有緩存相同?

謝謝!!

robert。 PS:

R version 2.15.1 (2012-06-22) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF8  LC_COLLATE=en_US.UTF8  
[5] LC_MONETARY=en_US.UTF8 LC_MESSAGES=en_US.UTF8 
[7] LC_PAPER=C    LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C   
[11] LC_MEASUREMENT=en_US.UTF8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] knitr_1.1 

loaded via a namespace (and not attached): 
[1] digest_0.6.3 evaluate_0.4.3 formatR_0.7 stringr_0.6.2 tools_2.15.1 
+0

僅供參考:這個問題已經被固定在[開發版本(https://github.com/yihui/knitr#readme)。 – 2013-04-07 04:46:57

回答

0

更新:當附加到knit()呼叫這裏是我的sessionInfo()這個問題已經固定在knitr development version。下面的答案可以忽略。


您可以認爲這是一個錯誤。自從報道了幾次以來,我一直在思考這個問題。我將在下一個版本中解決它(1.2)。

至於原因,那是因爲knitr使用一個單獨的空環境評估代碼時cache = TRUE,而這個環境的父框架是默認的全球環境,所以x是可訪問的,但不在這個真的存在空的環境。希望下面的代碼更好地解釋它:

x = 1 
env = new.env(parent = parent.frame()) 
ls(env) # character(0), nothing there 
exists('x', envir = env, inherits = FALSE) # FALSE 
env$x # NULL 
get('x', envir = env) # 1 
+0

感謝您的解釋和代碼。我擔心我不瞭解'knitr'是如何工作的。我期待着更新的版本。 – robertc 2013-04-05 14:05:06

+0

@robertc現在新版本在CRAN上。 – 2013-04-12 23:48:41