Sweave/knitr 提供哪些 make 不提供的功能?

Sweave/knitr 提供哪些 make 不提供的功能?

我使用 LaTeX 撰写论文,使用 R 进行数据分析和可视化,所以我一直在研究 Sweave 和 knitr。

Sweave 网站表示:

目的是创建动态报告,如果数据或分析发生变化,可以自动更新。

但在我看来,我当前的工作流程中已经有了这个,有一个 makefile 运行我的 R 脚本,然后使用脚本生成的图形和表格编译我的 LaTeX。

make 方法在缓存方面也表现得很好,例如,它检查我的数据文件和源文件的时间戳以知道何时重新编译各个组件。

似乎有了 Sweave/knitr,我就失去了跑步的能力只是我的 R 或我的 LaTeX,分别。

我是否遗漏了什么?Sweave 和 knitr 等解决方案提供了哪些功能,而它们却没有?

答案1

我对 LaTeX 还不熟悉(使用了大约 2 年),但发现 knitr 对以下方面非常有帮助:

  • 内联代码
  • 代码块 - 对执行非常有用,然后将其散布到您的文档中
  • 简单的图形集成到文档中
  • 缓存(我相信你可以通过观察文件变化来做到这一点)
  • 一个反应迅速的支持社区(至少在 freenode 上的 #r 上)

摘自 knitr 网站:

knitr ≈ Sweave + cacheSweave + pgfSweave + weaver + animation::saveLatex + R2HTML::RweaveHTML + highlight::HighlightWeaveLatex + 0.2 * brew + 0.1 * SweaveListingUtils + 更多

不过我确实使用了现在被认为过时的橡皮进行编译,所以我相信其他人可以提供更多关于制作具体来说。

答案2

如果您只想在 LaTeX 文档中包含一些表格和图形,那么文学编程范式(在本例中为 Sweave\knitr)可能会有一点优势。

但在大型文档中,查看您在 LaTeX 中编写的有关统计测试、表格和图形的内容非常有用,这些内容与产生这些结果的相关 R 块相邻。这样,R 块通常是自解释的,因此您不需要 R 脚本的大多数注释。

更重要的是,如果你单独运行 R,你可以更新表格和图形,但不能更新你在 LaTeX 中写的关于这个结果的内容。例如:你有关于某个表格或图形中的向量的信息ac(2,3,4,5)比如箱线图):

a <- c(2,3,5,7)
boxplot(a)

因此,你在 LaTeX 中写道

...the mean of $a$ was 4.25 and ... 

一切正常,但稍后您在 R 脚本中将此向量更改为:

a <- c(2,3,4,7)

重新运行 R 和 LaTeX 后,你的箱线图已更新,但文本中的平均值仍为 4.25(而不是 4)。现在怎么办?你需要对文本进行深入检查,以更改此类错误。

相反,使用 Sweave,如果您有正确的数据,您始终可以显示正确的箱线图和正确的平均值:

<<myboxplot,fig=T>>=
`a <- c(2,3,5,7)`
boxplot(a)
@
 ...the mean of $a$ was \Sexpr{mean(a)} and ...

现在想象一段包含十几个 p 值的文本,例如:

... the t-test of $a$ was significant (p=0.0312) ... 

手动更新可能是一个噩梦。但自动更新很简单:

... the t-test of $a$ was significant (p=\Sexpr{round(t.test(a)$p.value},3))...

此外,这样您就可以 100% 确定 PDF 中显示的内容。在其他情况下,可能是 R 命令中的错误测试粘贴了 0.0312。

有人可能会争辩说,如果向量a更改为类似c(-2,3,4,7),则 p 值将正确更新为,0.207但不会更新相对 LaTeX 文本的含义(因为现在 0.207 是“不显著”),但请注意,自动更新不仅限于文本中的表格、图形和数值。您还可以创建一个 R 对象(said statsig),该对象有条件地具有字符串“显著”或“不显著”,t.test(a)$p.value 并打印为 S 表达式:

... the t-test of $a$ was \Sexpr{print(statsig)} (p=\Sexpr{t.test(a)$p.value}) ...

对于一篇已经获得数据而没有预期更新的文章来说,工作量可能太多了……但想象一下,您的 LaTeX 文档是某些实验室方法结果的每日报告……值得吗?

答案3

Forkrul 涵盖了大部分重大问题。我想补充一点:

R 代码的细粒度缓存

如果您更改了单个块中的一行代码,则文档缓存的其余部分将保留原样。我假设使用 make 您无法缓存长 R 脚本的部分输出 - 如果您在文件中进行了一处更改,则需要重新运行整个文件。

无需切换上下文即可管理代码和文本

当然,您可以使用 make 来运行 R,然后运行 ​​LaTeX。但您仍然需要手动维护至少两个文件 - 您的 .R 和 .tex。使用 knitr,您可以在一个文件中完成所有操作。这减少了每次从 .tex 移动到 .R 时上下文切换的成本。如果您对 Emacs 进行了很好的调整,那么这个成本可能很小,但我认为它不会为零。

根据需要将代码与文本分离

您仍然可以单独运行 R 代码。Emacs 和 Rstudio 都提供了一个接口,可以将 R 代码从 Rnw 文档直接发送到 R 解释器。如果您只想检查某个值,则无需生成 tex 文件。如果您想要一个纯 .R 文件,您还可以从文档中提取所有 R 代码。(通过purl()knitr 中的函数)。

确实,如果不运行 knitr/R,您就无法运行 LaTeX,但在这种情况下,这样做不再有用。您不再需要手动接触 .tex 文件,而是直接从 .R 文件生成 pdf。

与不懂 LaTeX 的同事合作

knitr 支持 Markdown 和 LaTeX,这使得它很多更适合不使用 LaTeX 的同事。我曾使用 knitr 向那些从未考虑花时间学习 LaTeX 的同事出售可重复的研究,并取得了一些成功。我也希望 knitr 能够帮助gateway drug吸引更多人使用 LaTeX ;)

相关内容