使用R-markdown编织钩子定制HTML报表中的格式表

时间:2018-09-25 05:50:49

标签: r hook r-markdown knitr

我正在尝试设置一个knitr::knit_hooks(),以在HTML报告中使用kableExtra自动格式化R-markdown块的数据帧输出。

我不想在列表数据的每个块的末尾重复添加以下行(或任何行):

head(iris) %>%
  kable("html") %>%
  kable_styling("hover", full_width = FALSE)

我想出了一个基于this answer的解决方案,该解决方案通过评估块 source 来工作(请参阅我的answer below,其中包括该方法存在的一些问题);我希望使用 output 块可能有更好的解决方案。

这里是一个示例。Rmd概述了我想要实现的目标。

---
title: "Untitled"
author: "Paul"
date: "25 September 2018"
output: html_document
---

```{r setup, include = F}

library(dplyr)
library(kableExtra)
library(knitr)

data(iris)

default_source_hook <- knit_hooks$get('source')

knit_hooks$set(
  output = function(x, options) {
    x %>%
      kable("html") %>%
      kable_styling("hover", full_width = FALSE)
  },
  source = function(x, options) {
    if(is.null(options$table))
      default_source_hook(x, options)
    else {
      eval(parse(text = x)) %>%
        kable("html") %>%
        kable_styling("hover", full_width = F)
    }}
)


```

Desired chunk input:

```{r test, echo = F}
head(iris)

```

Desired output will look like:

```{r output, echo = F}
head(iris) %>%
  kable("html") %>%
  kable_styling("hover", full_width = FALSE)

```

Solution using the source chunk output:

```{r table_format, results = "hide", table = T, eval = F}
head(iris)

```

谢谢。

2 个答案:

答案 0 :(得分:4)

如果不需要使用编织钩,则可能会有所帮助。想法是只定义一个函数,该函数将完全按照您想要的方式打印任何内容。这不会消除所有键入,但会大大减少键入。

---
title: "Untitled"
author: "Paul"
date: "25 September 2018"
output: html_document
---

```{r setup, include = F}

library(dplyr)
library(kableExtra)
library(knitr)

tbl_out <- function(data) {
  data %>% kable("html") %>% kable_styling("hover", full_width = FALSE)
}
```

Prints as desired:

```{r test, echo = F}
head(iris) %>% tbl_out()
```

输出:

enter image description here

答案 1 :(得分:2)

我通过使用Base 作为格式化的块输出找到了解决方法。

格式化块输出的困难在于将字符数据传递到挂钩。从OP中的链接答案中汲取灵感,我通过评估knit_hooks()中的块 source 找到了解决方案。

此解决方案重新评估块并将其传递到所需的knit_hooks()格式中。

我需要添加一个新的块选项KableExtra,以便将格式仅应用于生成数据表的源代码;还需要table = T,因此默认块输出未包含在报告中。

results = "hide"

此解决方案存在一些问题

  1. 用于生成表格的代码现在不可用
  2. 应包含eval = F-特别是如果代码需要一段时间才能运行(因为它再次在钩子中评估)
  3. 我要用3个大块选项替换2行代码-尽管这不是交易杀手,但它并没有我想要的那么自动。