我遇到了在父代码块中“调用”子级.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.")) ```
答案 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)