4

我正在尝试在我的调用之外knit设置一个全局块选项,如下所示:

opts_chunks$set(dev='pdf')
knit(input)

但是,它不起作用,因为knit似乎使用了一组新的opts_chunksinside knit

是否可以在调用之外设置全局块选项knit,并将其应用于调用knit


我这样做的原因:

我正在编写Rmd(R markdown)文档,我希望能够将它们编织成 pdfHTML,我的选择,如下所示:

knit2 <- function (input, out=c('pdf', 'html')) {
    # set the appropriate output image format
    opts_chunk$set(dev=ifelse(out == 'pdf', 'pdf', 'svg')) # <--

    # knit to md
    o <- knit(input)

    # knit md to html or pdf
    pandoc(input=o, format=ifelse(out == 'pdf', 'latex', 'html'))
}

所以我的想法是我可以knit2('mydoc.Rmd', 'pdf')ORknit2('mydoc.Rmd', 'html')并且我不必根据输出更改 Rmd

我遇到的问题是我希望我的图像是 SVG 用于 HTML 输出,PDF 用于 PDF 输出(我想要矢量图形但 SVG 在 Latex 中不起作用,而 pdf 在 HTML 中不起作用,所以我需要修改这基于输出格式),即

opts_chunk$set(dev=ifelse(out == 'pdf', 'pdf', 'svg'))

我知道如果我将它与 的定义一起放在我的 Rmd 文件中的一个块中out,它将起作用。但是,我不想将它嵌入其中mydoc.Rmd,因为我无法分配output直到knit2被称为我知道我真正想要的输出。

因此,我希望 knit2dev在调用之前以某种方式为我设置选项,knit并让该选项适用于knit. (我也接受将 my 嵌入opts_chunk$set(dev=ifelse(out=='pdf', 'pdf', 'svg'))到我的 Rmd 文件中,前提是我可以在 Rmd 文件out 之外定义,即 in knit2,但如果我能处理这一切,knit2我会更喜欢)

4

1 回答 1

4

可以在文档之外设置全局选项,该dev选项是唯一的例外。当输出为 HTML 时dev'png'render_markdown(). 如果你想改变这个选项,你必须在它之前调用这个函数:

knit2 <- function (input, out=c('pdf', 'html')) {
  if (out == 'html') {
    render_markdown()
    # use SVG for HTML output
    opts_chunk$set(dev='svg')
  }

  # knit to md
  o <- knit(input)

  # knit md to html or pdf
  pandoc(input=o, format=ifelse(out == 'pdf', 'latex', 'html'))
}

实际上我有一个非常相似的问题,并在示例 084中说明了这一点(见084-pandoc.R那里;我改为devMarkdown 'pdf')。

于 2013-04-17T05:04:47.480 回答