【发布时间】:2021-09-25 04:28:36
【问题描述】:
我使用knitr::knit_engines$set() 为 knitr 创建了一个自定义块引擎,它采用一些 YAML 规范,解释它们,并创建一个绘图作为输出。如果将 knitr 文档呈现为 HTML,我让它创建闪亮的输出,我使用 htmltools::knit_print.shiny.tag() 将其转换为 HTML,并且效果很好。但是,如果我渲染为 pdf/docx/odf,我会创建一个静态绘图对象而不是闪亮的输出。这一点很好,但我能得到它渲染的只是情节的文本表示(即列表对象),而不是情节的图像。
我需要以某种方式将图像(我假设)传递给 knitr::knit_engines$set() 的输出,但是如果我尝试将绘图保存到 png 然后将其作为输出传递,我只会得到文本表示代替文件路径。
knitr::knit_engines$set(example = function(options) {
#### read options$code and do stuff - works fine
p <- ggplot(data = mpg) + geom_jitter(aes(x = cty, y = hwy))
##### output results
# Shiny - outputs html text. Works fine
if(knitr::opts_knit$get("rmarkdown.pandoc.to") == "html"){
shiny::plotOutput(p) %>%
htmltools::knit_print.shiny.tag()
# Static output formats (pdf, etc)
} else {
#### attempt 1 ####
p # returns list object
#### attempt 2 ####
ggsave(filename = here("temp", "out.png"), plot = p)
knitr::include_graphics(here("temp", "out.png")) # Returns here("temp", "out.png")
}
})
我浏览了 Github 上的 knitr/R/engine.R 以寻找灵感,但只是迷路了。
【问题讨论】:
-
如果可能,您应该包含一个可重现的示例。它不需要是您的真实代码,只需一些简短的行为方式即可,因此我们可以尝试一下,看看建议是否有效。
-
如果将
p # returns list object替换为print(p) # returns list object,是否会得到相同的结果? -
不幸的是 print(p) 和 plot(p) 都返回和返回 p 一样