Передать пользовательскую функцию в RMarkdown YAML df_print для печати фреймов данных при вязании вывода HTML

#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. Рад помочь! Было бы неплохо, если бы вы могли принять и / или поддержать мой ответ тогда (: