首页 > 解决方案 > 将自定义函数传递给 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,并且我发现过去的帖子似乎已经达到了解决方法,但我终生无法弄清楚如何从标题中调用此函数。谢谢你的帮助!〜杰米

标签: ryamlr-markdownknitrkableextra

解决方案


我在rmarkdown 文档中找不到这个,但我认为不建议将像你这样的复杂函数传递给df_printYAML 标头中的参数。但是,根据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。


推荐阅读