Knitr和父子R代码块:子代的块无法识别循环

时间:2017-06-26 23:23:32

标签: r knitr r-markdown

我遇到了在父代码块中“调用”子级.Rmd脚本的问题。父R markdown文件中的R块循环遍历变量,并调用使用父变量的子R markdown文件。

问题:子markdown文件只会在markdown中作为乳胶代码循环遍历 R代码块之外的父变量。子markdown文件中R代码块内的任何内容只会使用循环中的 first 变量。什么可能导致孩子在markdown中的乳胶代码工作正常,但R块没有跟上父代循环中变化的变量?

父文件的理论示例:

    ```{r setup, include=FALSE}
library(knitr)
knitr::opts_chunk$set(cache=TRUE)

x <- as.vector(list(1:10))
```
## Now for the R chunk with loop on the child
```{r parent}

xD <- NULL
for (i in 1:length(x[[1]])){
  out = NULL #reset the output of the loop to null, so duplicates aren't printed
  xD[i] <- as.numeric(x[[1]][i])*2
  currentValue <- xD[i]
  out <- c(out, knit_expand(file = "test_child.Rmd"))
  cat(knit(text=unlist(paste(out, collapse = '\n')), quiet=TRUE))
}

子文件test_child.Rmd的理论示例:

The value outside a code chunk is `r currentValue` and 
always updates with the variable in the parent's loop. 
```{r childchunk}
     print(paste0("But inside a code chunk, the value is", currentValue, "and
     remains the same as the first value, regardless of the parent's loop
     index.")) ```

1 个答案:

答案 0 :(得分:4)

问题在于使用cache = TRUE

如果缓存了块,则代码不会被执行,因此忽略currentValue的最新值。

{r childchunk, cache = FALSE}
     print(paste0("But inside a code chunk, the value is ", currentValue, " and
     remains the same as the first value, regardless of the parent's loop
     index. Unless you set cache = FALSE")) 

还要注意父母。如果您将其保留为缓存状态,则只有在对子项进行更改时才会更新。我建议使用

{r parent, cache = FALSE}

你当然可以使用

knitr::opts_chunk$set(cache=FALSE)