r - 将自定义函数传递给 RMarkdown YAML df_print 以在编织 HTML 输出时打印数据帧
问题描述
这是我第一次在 Stack Overflow 上发帖,所以如果这是一个格式错误或不可重现的问题,请原谅我。我正在尝试将以下自定义数据表打印函数('print.me')传递给 RMarkdown 中的 YAML 标头,以便将 df_print 编织为 HTML:
print.me <- function(x) {
x <- x %>% kbl(digits=2, align= 'l', booktabs=T) %>%
kable_styling(fixed_thead = T, position ="float_right") %>%
kable_paper("striped", full_width = T, fixed_thead = T,
html_font = "Helvetica", font_size = 11) %>%
row_spec(0, color = "yellow", background = "#5b705f", font_size = 12) %>%
scroll_box(width = "700px", height = "300px")
return(x)
}
从 RMarkdown 打印 mtcars 时,此函数成功呈现了我希望的数据帧格式:
问题是我无法找到将“print.me”成功传递给 YAML 标头的方法,以便“print.me”成为编织 HTML 时呈现数据帧的默认方法。我在 YAML 标头中的代码如下所示:
df_print: !expr 'print.me'
但是,我收到以下错误消息:
错误:找不到对象'print.me' yaml::yaml.load(..., eval.expr = TRUE) 中的错误:无法评估表达式:print.me 调用:... parse_yaml_front_matter -> yaml_load -> 执行停止
该df_print
文档声称可以将任意函数传递给df_print
,并且我发现过去的帖子似乎已经达到了解决方法,但我终生无法弄清楚如何从标题中调用此函数。谢谢你的帮助!〜杰米
解决方案
我在rmarkdown 文档中找不到这个,但我认为不建议将像你这样的复杂函数传递给df_print
YAML 标头中的参数。但是,根据GitHub 上的这个问题(简化版)print.me()
,它是这样的:
---
title: "testprint"
output:
html_document:
df_print: !expr print.me <- function(x, ...) { knitr::asis_output(kableExtra::kbl(x, digits=2, align= 'l'))}
---
相反,您可以注册自己的方法来在代码块中打印数据帧(最好在 YAML 标头之后),如下所示:
```{r setup, include=FALSE}
library(kableExtra)
library(knitr)
print.me <- function(x, ...) {
x %>%
kbl(digits=2, align= 'l', booktabs=T) %>%
kable_styling(fixed_thead = T, position ="float_right") %>%
kable_paper("striped", full_width = T, fixed_thead = T,
html_font = "Helvetica", font_size = 11) %>%
row_spec(0, color = "yellow", background = "#5b705f", font_size = 12) %>%
scroll_box(width = "700px", height = "300px") %>%
asis_output()
}
registerS3method("knit_print", "data.frame", print.me)
```
技术细节有点复杂。简而言之,我们用自定义函数覆盖在检查要打印的对象的类时调用的默认函数(极客调用此过程方法 dispatch)并将此方法注册到 knitr。
推荐阅读
- tensorflow - 在 hdfs 上保存 Keras 模型
- c++ - 我在使用 null 时遇到问题
- c# - 如何在保持项目文件 .mdf 完整的同时仅保存 bin 文件夹中的数据库更改
- python - 什么时候在python中将对象加载到内存中?
- neo4j - 对于这种相似情况,我应该使用 RDB
- python - 如何将标签链接到图片并将它们输入 Pytorch 中的训练函数?
- python-3.x - 有没有办法让两个代码块一个接一个
- node.js - 在启动 Node/Express 服务器之前连接到 MySQL
- c# - 创建一个自定义按钮,以便能够从 Outlook 电子邮件中获取数据并将该数据移动到 Oracle 表中
- java - (libgdx) 为什么我的精灵被渲染得这么大?