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,并且我发现过去的一篇文章似乎已经达到了解决方法,但我一生都无法弄清楚如何从标头调用此函数。谢谢你的帮助!〜杰米
我在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。