我相信 cache = TRUE 尝试缓存在块中创建的R对象。你的第一个块不仅仅是创建对象: attach 和 require 每个调用都有副作用:修改搜索列表,加载包等。这些副作用不会被缓存,但是文档需要它们才能工作: knitr 没有理由再次运行块,你的文件在第二次运行时失败。
cache = TRUE
attach
require
knitr
你通常使用 cache = TRUE 当块进行长时间的慢速计算以生成数据集以供以后绘制或汇总时,因为随后的运行可以跳过计算的缓慢部分。
你问为什么 require(knitr) 需要。严格来说,它不需要:你可以使用 knitr::opts_chunk 代替。但更重要的是,我们的想法是R Markdown文档是对独立R会话的描述。是的,你需要 knitr 处理它,但它应该给出相同的结果,就像你在空会话中自己运行代码一样。 (这不完全正确: knitr 大块的选项和钩子会稍微修改一下这个行为,但它是一个方便的心理模型。)
require(knitr)
knitr::opts_chunk