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

“ls()”的不同行为取决于knitr Rmd文档中的cache=T或cache=F,r,knitr,R,Knitr,下面是简单的test.Rmd knitr文档 ```{r} opts_chunk$set(cache=TRUE) ``` ```{r} x <- 1 ``` ```{r} x ls() ``` 生成具有以下输出的pdf文件test.pdf: x <- 1 x ## [1] 1 ls() ## character(0) 更新:此问题已在中修复。下面的答案可以忽略 你可以认为这是一个错误。自从有几次报道以来,我一直在思考这个问题。我将在下一个版本1.2中解决这个问题 至于

下面是简单的test.Rmd knitr文档

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

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

```{r}
x
ls()
```
生成具有以下输出的pdf文件test.pdf:

x <- 1

x

## [1] 1

ls()

## character(0)

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

<>你可以认为这是一个错误。自从有几次报道以来,我一直在思考这个问题。我将在下一个版本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

谢谢你的解释和代码。我担心我不了解knitr的工作原理。我期待更新的版本。@robertc新版本现在正在CRAN上。仅供参考:此问题已在中修复。
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  
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