“ls()”的不同行为取决于knitr Rmd文档中的cache = T或cache = F.

时间:2013-04-04 12:21:29

标签: r knitr

以下简单的test.Rmd knitr文件

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

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

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

从Unix shell处理时使用:

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

使用以下输出生成pdf文件(test.pdf):

x <- 1

x

## [1] 1

ls()

## character(0)

也就是说,最后一个代码块的输出首先显示x的内容,而ls()调用未显示工作区中有一个名为x的对象。如果我通过删除第一个代码块来禁用cache,那么ls()会按照我的预期显示x。我无法从文档中找出ls()使用opts_chunk$set(cache=TRUE)时此行为的原因。是否有人可以向我解释为什么会发生这种情况?如果有和没有缓存,我怎么能以相同的方式表现ls()

谢谢!

罗伯特。 ps:这是我的sessionInfo(),当附加到knit()来电时:

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  

1 个答案:

答案 0 :(得分:0)

更新:此问题已在knitr development version中修复。下面的答案可以忽略不计。


您可以将此视为错误。我已经在这个问题上思考了很长时间,因为它已被报道过几次。我将在下一个版本(1.2)中解决它。

至于原因,这是因为knitrcache = TRUE时使用单独的空环境来评估代码,并且默认情况下此环境的父框架是全局环境,因此{{1是可访问的,但在这个空的环境中并不存在。希望下面的代码能更好地解释它:

x