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
    可以来自第一个块(第一次编译文档),也可以从缓存加载(第二次编译文档)。如果您认为这很好,请不要缓存第一个代码块。我只是想让你明白后果。