将自定义函数传递给 RMarkdown YAML df_print 以在编织 HTML 输出时打印数据帧

Jam*_*e_R 2 yaml r knitr r-markdown kableextra

这是我在 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)
}
Run Code Online (Sandbox Code Playgroud)

此函数成功呈现了我在从 RMarkdown 打印 mtcar 时所希望的数据帧格式:

在此输入图像描述

问题是我无法找到一种方法来成功地将“print.me”传递到 YAML 标头,以便“print.me”成为编织到 HTML 时渲染数据帧的默认方法。我在 YAML 标头中的代码如下所示:

df_print: !expr 'print.me'
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息:

错误:找不到对象“print.me” yaml::yaml.load(..., eval.expr = TRUE) 中的错误:无法计算表达式:print.me 调用:... parse_yaml_front_matter -> yaml_load -> 执行停止了

df_print文档声称可以将任意函数传递给df_print,并且我发现过去的一篇文章似乎已经达到了解决方法,但我一生都无法弄清楚如何从标头调用此函数。谢谢你的帮助!〜杰米

Mar*_*old 5

我在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'))}
---
Run Code Online (Sandbox Code Playgroud)

相反,您可以注册自己的方法来在代码块中(最好是在 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)
```
Run Code Online (Sandbox Code Playgroud)

技术细节有点复杂。简而言之,我们用自定义函数覆盖在检查要打印的对象的类时调用的默认函数(极客称此过程方法为dispatch),并将此方法注册到knitr。