【发布时间】:2021-12-19 02:38:57
【问题描述】:
我已经在 rmarkdown 中构建了一个函数来生成一些具有给定值的 HTML 输出,但是如果传递的值之一引用了 ggplot 对象,我希望它能够工作。
基本上,knitr 完美地呈现了这一点:
x <- [R computation]
y <- [ggplot figure]
<div id="some_number">`r x`</div>
<div id="some_figure">
```{r}
y
```
</div>
但我不想每次使用具有不同x 和y 的特定html 块时都必须重写它。于是我写了如下函数:
html_func <- function(x,y) {
template <- "
<div id=\"some_num\">{x}</div>
<div id=\"some_fig\">{y}</div>
"
instance <- glue::glue(template)
output <- knitr::asis_output(instance)
return(output)
}
number <- [R computation]
figure <- [ggplot figure]
html_func(number, figure)
渲染的页面显示在 div 中正确计算的“数字”,但不渲染绘图。
如何让它在 HTML 容器中生成绘图?
更新:评论者建议使用实时数据,所以我们开始吧。
这行得通:
```{r}
library(ggplot2)
data(mtcars)
number <- mean(mtcars$mpg)
figure <- ggplot2::ggplot(mtcars, aes(x=hp, y=mpg)) +
geom_point()
```
<div id="some_number">`r number`</div>
<div id="some_figure">
```{r echo=FALSE}
figure
```
</div>
但事实并非如此。计算输出正常,但绘图不渲染。
```{r}
library(ggplot2)
data(mtcars)
number <- mean(mtcars$mpg)
figure <- ggplot2::ggplot(mtcars, aes(x=hp, y=mpg)) +
geom_point()
html_func <- function(x,y) {
template <- "
<div id=\"some_num\">{x}</div>
<div id=\"some_fig\">{y}</div>
"
instance <- glue::glue(template)
output <- knitr::asis_output(instance)
return(output)
}
html_func(number, figure)
```
这是比较两者的屏幕截图。
【问题讨论】:
-
希望在示例中很清楚 [] 中的文本只是任意内容的占位符,而不是实际语法。
-
我无法让你的函数工作(也许显示一些允许它为你工作的实际对象?)但我想知道你是否需要一个明确的
print()用于情节。无论如何,这在results = "asis"样式块中是必要的。 -
谢谢@aosmith。我更新了帖子以纠正一个可能导致问题的小错误,用数据复制了问题,并显示了我的输出。
-
您可以使用
print(figure)而不仅仅是figure来获取绘图,但看起来您仍然可以获得打印的对象。您是附加到knitr::asis_output()还是考虑使用results = "asis"块?不过,我从来没有用过用 R 输出编写 HTML,只有 markdown,所以也许这是个问题。 -
如您所述,
print(figure)生成了绘图,但未在 HTML 容器中呈现,并且打印的对象仍然出现。我没有与knitr::asis_output()结婚,但做{r results="asis"]会产生同样的结果。
标签: html r ggplot2 r-markdown knitr