#r #yaml #r-markdown #knitr #kableextra
#r #yaml #r-markdown #knitr #kableextra
Вопрос:
Это моя самая первая публикация о переполнении стека, поэтому, пожалуйста, простите меня, если это неверно сформулированный или невоспроизводимый вопрос. Я пытаюсь передать следующую пользовательскую функцию печати таблицы данных (‘print.me ‘) в заголовок YAML в RMarkdown для преобразования 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)
}
Эта функция успешно отображает формат фрейма данных, на который я надеюсь при печати mtcars из RMarkdown:
Проблема в том, что я не могу найти способ успешно передать ‘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
, и я нашел прошлый пост, который, похоже, нашел обходной путь, но я ни за что на свете не могу понять, как вызвать эту функцию из заголовка. Спасибо за любую помощь! ~ Джейми
Ответ №1:
Я не смог найти это в документации rmarkdown, но я не думаю, что рекомендуется передавать сложную функцию, подобную вашей, в df_print
аргумент в заголовке YAML. Однако, согласно этой проблеме на 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)
```
Технические детали немного сложны. Короче говоря, мы перезаписываем функцию по умолчанию, которая вызывается при проверке класса объекта, подлежащего печати (гики называют эту процедуру методом отправки), пользовательской функцией и регистрируем этот метод в knitr.
Комментарии:
1. Большое спасибо M.A, — Я просто немного запутался в документации: «Чтобы полностью настроить формат, функция может быть передана df_print через yaml или format function. Это можно использовать для пользовательской функции печати или для передачи некоторых параметров »
2. Добро пожаловать. Я не смог найти это в официальной документации, но я немного погуглил. Я отредактировал свой ответ.
3. Ты потрясающий. Большое спасибо.
4. Рад помочь! Было бы неплохо, если бы вы могли принять и / или поддержать мой ответ тогда (: