gpt4 book ai didi

r - knitr 自定义引擎 block 的输出图

转载 作者:行者123 更新时间:2023-12-04 12:15:27 26 4
gpt4 key购买 nike

我已经为 knitr 创建了一个自定义块引擎 knitr::knit_engines$set()它采用一些 YAML 规范,解释它们,并创建一个图作为输出。如果将 knitr 文档呈现为 HTML,我将创建 Shiny 的输出,然后使用 htmltools::knit_print.shiny.tag() 将其转换为 HTML。这工作正常。但是,如果我渲染为 pdf/docx/odf,我会创建一个静态绘图对象而不是 Shiny 的输出。这一点很好,但我能让它呈现的是绘图的文本表示(即列表对象),而不是绘图的图像。
我需要以某种方式将图像(我假设)传递给 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")
}
})
我已经浏览了 knitr/R/engine.R在 Github 上寻求灵感,但刚刚迷路了。

最佳答案

这个“失败”的原因是knitr::include_graphics()这样工作:它返回一个 structure包含路径(和一些附加参数),在 PDF/LaTeX 输出的情况下,只会打印路径。
相反,您需要通过 knitr::engine_output 将结构传递给输出 Hook :

imgpath <- here("temp", "out.pdf")
ggsave(plot = p,
filename = imgpath,
device = "pdf",
width = 15, height = 8, units = "cm")
knitr::engine_output(
options,
out = list(knitr::include_graphics(imgpath))
)
(请注意,我将图像另存为 PDF,我发现它比光栅图像更易于处理。)
```{example}
This is your example engine chunk.
```
enter image description here

关于r - knitr 自定义引擎 block 的输出图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68407786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com