knitr - 设置chunk选项*在*文档外?

时间:2013-04-17 03:59:59

标签: r knitr

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

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

但是,它无效,因为knit似乎在opts_chunks中使用了一组新的knit

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


我正在这样做的原因:

我正在撰写Rmd(R markdown)文档,我希望能够将这些文档编织为pdf HTML,我的选择如此:

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')knit2('mydoc.Rmd', 'html')而我根据输出不必更改Rmd。

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

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

我知道如果我将它放在我的Rmd文件中的一个块中以及out的定义,它将起作用。 但是,我不想在mydoc.Rmd中嵌入此内容,因为在output被调用之前我无法分配knit2,我知道我真正想要的输出。

因此,我希望knit2在调用dev之前以某种方式为我设置knit选项,并且该选项适用于knit的持续时间。 (我也接受将opts_chunk$set(dev=ifelse(out=='pdf', 'pdf', 'svg'))嵌入到我的Rmd文件中,前提是我可以在Rmd文件外部定义out ,即knit2,但如果我可以从knit2处理所有内容我更喜欢<)>

1 个答案:

答案 0 :(得分: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'))
}

实际上我遇到了一个非常类似的问题,并在example 084中进行了说明(请参阅084-pandoc.R;我已将dev更改为'pdf'以获得Markdown。