Sweave 诉 Knitr 诉 Rmarkdown:代码块 headers

Sweave v. Knitr v. Rmarkdown: code chunk headers

我正在尝试了解 rmarkdownsweaveknitr 之间的关系。查看代码和示例我将 运行 分为两种类型的代码 headers 并且我不明白它们属于什么 language/package 。

headers是

```{}
```

<<>>=
@
  1. 它们有什么区别?
  2. 它们与 rmarkdownsweaveknitr 有何关系?
  3. 如果我在 .rnw 上工作,我在使用哪一个?

sweave 和 rmarkdown 都提供了为 R、python 和其他编程语言 运行 任意代码的能力。各自的优缺点各不相同,但快速比较一下:

R 降价:

  • 典型的文件扩展名:.rmd(不区分大小写),也许 .rmarkdown

  • 支持 R、python 和 several other languages

  • 输出到 HTML、docx、LaTeX(因此也是 PDF)和 several other output formats

  • 使用三重反引号进行分块

      Regular text.
    
      ```{r chunkname, chunkoptions, ...}
      a <- 1
      ```
    
      ```{python pychunk, chunkoptions, ...}
          def myfun(v: list) -> list:
          """
          Something important in this docstring.
          """
          return [a+1 for a in v]
      ```
    
      More regular text.
    
  • 因为是基于markdown,所以对于交叉引用,table-control等有一些限制;其中许多都有软件包和已知的缓解技术(太多无法在此处列出)。但是,您可以在 markdown 中使用直接的 LaTeX 格式,因此输出到 PDF 也可以享受该控制(尽管 LaTeX 代码未翻译为其他输出格式)。

挥动:

  • 典型的文件扩展名包括 .rnw(不区分大小写),我见过 .noweb(对此不完全确定...)

  • 支持 R,如果您可以通过 R 访问其他语言(例如通过 reticulate),可能还支持其他语言

  • 输出到 LaTeX 和 PDF

  • 使用<<>>=@进行分块:

      Regular text.
    
      <<chunkname, chunkoptions, ...>>=
      a <- 1
      @
    
      More regular text.
    
  • 因为它直接基于 LaTeX,所以您可以尽可能多地控制格式、交叉引用等

knitr

  • 处理 sweavermarkdown 格式的文件
  • 可能需要一些摆动预处理(例如,使用 Sweave2knitr),参考:https://yihui.name/knitr/demo/sweave/
  • rationale for knitr 是为了 "解决了Sweave中长期存在的一些问题,将其他附加包中的特性合并为一个包(knitr≈Sweave+cacheSweave+pgfSweave+weaver+animation::saveLatex+R2HTML::RweaveHTML+highlight::HighlightWeaveLatex + 0.2 * brew + 0.1 * SweaveListingUtils + 更多)。"