1

下面是简单的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)

也就是说,最后一个代码块的输出首先显示了调用的内容,xls()调用并没有显示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  
4

1 回答 1

0

更新:此问题已在knitr 开发版中修复。下面的答案可以忽略。


您可以将此视为错误。这个问题我想了很久,因为已经报道过几次了。我将在下一个版本(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
于 2013-04-04T22:43:24.403 回答