我正在尝试设置一个全局块选项在外面调用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
处理所有内容我更喜欢<)>
答案 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。