knitr能否将使用()所做的更改缓存到环境中?
使用knitr能否将使用()所做的更改缓存到环境中?,r,knitr,R,Knitr,使用with()对环境对象所做的更改似乎不会被缓存: ```{r} foo <- new.env() ``` ```{r, cache=TRUE} with(foo, bar <- 42) ``` ```{r} foo$bar ``` `{r} foo您没有缓存第一个代码块,这意味着每次编译此文档时,都会执行第一个代码块。这意味着每次你得到一个全新的环境 然后缓存第二个代码块。关于knitr的缓存,最重要的一点是缓存块不会在第二次编译文档时进行计算(除非对代码块进行了更改)。由
with()
对环境
对象所做的更改似乎不会被缓存:
```{r}
foo <- new.env()
```
```{r, cache=TRUE}
with(foo, bar <- 42)
```
```{r}
foo$bar
```
`{r}
foo您没有缓存第一个代码块,这意味着每次编译此文档时,都会执行第一个代码块。这意味着每次你得到一个全新的环境
然后缓存第二个代码块。关于knitr的缓存,最重要的一点是缓存块不会在第二次编译文档时进行计算(除非对代码块进行了更改)。由于未计算此代码块,bar
未在foo
环境中分配
简言之:
foo
总是一个新环境
bar
不会在您第二次编译文档时创建
这就解释了为什么bar
为NULL
。要解决此问题,必须缓存第一个代码块。但是还有另一个警告:由于使用了with()
,knitr将无法发现foo
在第二个代码块中被修改,因此您必须告诉knitr应该缓存对象foo
。完整的解决方案是:
```{r, cache=TRUE}
foo <- new.env()
```
```{r, cache=TRUE, cache.vars='foo'}
with(foo, bar <- 42)
```
```{r}
foo$bar
```
`{r,cache=TRUE}
foo即使没有第一个块的cache=TRUE
,它似乎也能工作。第二个代码块中的cache.vars='foo'
似乎足够了。@如果不缓存第一个代码块,第一个代码块中的foo
将与第二个代码块中的foo
实际是一个不同的环境:第一个foo
始终是一个新环境,但是第二个foo
可以来自第一个块(第一次编译文档),也可以从缓存加载(第二次编译文档)。如果您认为这很好,请不要缓存第一个代码块。我只是想让你明白后果。