简述
使用knit()
/knit2pdf()
代替RStudio中的“编译PDF”按钮可能会有一些(可能是不需要的)副作用。
动机
大多数knitr
用户似乎在RStudio中编写文档,并使用“编译PDF”/“Knit HTML”按钮编译文档。这通常很顺利,但偶尔会有一些特殊要求无法通过编译按钮实现。在这些情况下,解决方案通常是直接调用knit()
/knit2pdf()
/rmarkdown::render()
(或类似函数)。
以下是一些例子:
使用knit2pdf()
而不是“编译PDF”按钮通常提供了这些问题的简单解决方案。但是,这是有代价的:与“编译PDF”处理文档在单独的进程和环境中有根本的区别,而knit2pdf()
和其它函数则没有。
这有一些影响,问题在于并非所有这些影响都是显而易见的。以knit()
使用全局环境中的对象(而“编译PDF”不使用)为例。这可能很明显,并且在像上面第二个示例这样的情况下是期望的行为,但当knit()
用于解决类似示例1和3中的问题时,这是一个意外后果。
此外,还有更微妙的差异:
问题及其目标
每当我读/写建议使用knit2pdf()
而不是“编译PDF”时,我想“正确,但用户应该了解后果…”。
使用
knit()
/knit2pdf()
而不是RStudio中的“编译PDF”按钮可能会产生哪些(可能不需要的)副作用?如果有一个全面的(社区维基?)答案来回答这个问题,它可以链接到未来建议使用
knit2pdf()
的答案中。相关问题
有数十个与此问题相关的问题。然而,它们要么只提出了代码以(或多或少地)复制RStudio按钮的行为,要么解释了“基本上”发生了什么,而没有提到可能存在的缺陷。其他问题看起来非常类似,但实际上是它的一个(非常)特殊情况。以下是一些例子:
- Knit2html未能复制R Studio中Knit HTML按钮的功能:缓存问题。
- 使用Rstudio中的knitr和命令行中的knit2html生成的HTML输出不同:Markdown版本不同。
- 如何将R Markdown转换为HTML?即,“Knit HTML”在Rstudio 0.96中做了什么?:Yihui给出了一个相对肤浅的答案(解释了“基本上”发生了什么),并提供了一些选项来重现RStudio按钮的行为。建议的
Sys.sleep(30)
和“编译PDF”日志都没有洞见(这两个提示指向了同一件事情)。 - 在Rstudio 0.98中,“Knit HTML”做了什么?:重现按钮的行为。
关于答案
我认为这个问题提出了许多应该包含在答案中的问题。然而,可能还有很多我不知道的方面,这就是为什么我不愿意自己回答这个问题的原因(尽管如果没有人回答,我可能会尝试)。
可能,一个答案应该涵盖三个主要点:
- 新会话与当前会话问题(全局选项,工作目录,已加载的包等)。
- 第一点的结果:事实上,
knit()
使用来自调用环境的对象(默认值:envir = parent.frame()
),并对可重现性产生影响。我试图解决防止knit()
使用文档外部对象的问题,this answer(第二个项目符号)。 - RStudio秘密处理的事情...
- ...启动交互式会话时(example)-->在点击“编译PDF”时不可用
- ...当点击“编译PDF”时(除了设置为处理文件的新会话和工作目录之外,还有什么特殊的东西吗?)
knit()
时会发生什么以及其影响”两种方法来解决问题是一个好的方式。
1. 当编写RMD文档时,"Knit HTML"按钮也适用于相同的情况。