Использование крючков R-markdown knitr для пользовательских таблиц форматирования в отчетах HTML - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь настроить knitr::knit_hooks() для автоматического форматирования вывода фрейма данных фрагмента R-markdown с kableExtra в моем отчете HTML.

Я не хотел бы повторно добавлять следующие строки(или любые строки) до конца каждого куска табулированных данных:

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

Я придумал одно решение на основе этого ответа , которое работает путем оценки источника куска (см. Мой ответ ниже , который включает некоторые проблемы, которые у меня возникают с этим подходом);Я надеюсь, что может быть лучшее решение, используя чанк 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 голосов
/ 27 сентября 2018

Я нашел обходной путь, используя knit_hooks() источник в качестве форматированного вывода чанка.

Сложность при форматировании чанка вывода заключается в том, что этот символданные передаются на крючок.Черпая вдохновение из связанного ответа в ОП, я нашел решение, оценивая блок source в knit_hooks().

Это решение повторно оценивает блок и перенаправляет его в нужный KableExtra форматирование.

Мне нужно было добавить новую опцию чанка table = T, чтобы форматирование применялось только к исходному коду, который создает таблицу данных;results = "hide" также был необходим, поэтому вывод чанка по умолчанию не был включен в отчет.

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

```{r setup, include = F}

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

default_source_hook <- knit_hooks$get('source')

knit_hooks$set(
  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)
    }

  }
)

data(iris)

```

## Normal
With no chunk options:

```{r normal}
head(iris)

```

## The desired ouptut
With chunk options `results = "hide"` and `table = T`:

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

```

## It still work as normal for other other output types
With no chunk options:

```{r image}
iris %>%
  ggplot(aes(x = Sepal.Length, y = Sepal.Width, group = Species)) +
  geom_point()

```

Есть несколько проблем с этим решением

  1. код, используемый для созданиятаблица теперь недоступна
  2. eval = F должен быть включен - особенно если запуск кода займет некоторое время (как это снова оценивается в хуке)
  3. Я заменяю 2 строкикод с 3-мя вариантами блоков - хотя это и не убийца сделок, но он не настолько автоматизирован, как мне бы хотелось.
0 голосов
/ 25 сентября 2018

Если использование вязаных крючков не требуется, может помочь следующее.Идея состоит в том, чтобы просто определить функцию, которая печатает все, что получает, именно так, как вы хотите.Это не устраняет всю типизацию, но существенно уменьшает ее.

---
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

...