RMD: как создавать фрагменты с вкладками с помощью циклов с графиками и таблицами

#r #r-markdown

Вопрос:

У меня есть много похожих наборов данных, которые я хочу вывести в файл RMD и сохранить каждый вывод на определенной вкладке.

Я создал две функции, которые генерируют таблицу (с помощью Kable) и график ggplot. Чтобы избежать повторения написания их всех (это заняло бы у меня целую вечность) Я попытался написать цикл, используя функцию cat (), чтобы сгенерировать для меня фрагменты и вывести таблицы и графики на правильной вкладке.

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

Смотрите пример ниже:

 ```{r,fig.width=6,echo=FALSE,results =“asis”}

types <- c(“mpg”,”cyl”,”hp”)
Headers <- c(“header 1”,”header 2”)

for (i in headers) {
 cat(paste0(“# “,i,”{.tabset} n”))
  for (j in types) {
   cat(paste0(“# “,j,” n”))

#this is where the problems begin   
   cat(“```{r} n”)
   plot(mtcars[j])
   cat("  n")

 }
}
 

Кроме того, в нынешнем виде кажется, что ни базовый график R не работает, ни функции ggplot/kable, которые я создал.

У меня было много проблем с этим, и мне не хватает времени для этого отчета, так что любая помощь будет очень признательна!! Если есть лучший способ сделать это, пожалуйста, дайте мне знать!

Спасибо за помощь!

Ответ №1:

При следующих корректировках ваш минимальный рабочий пример дает желаемый результат:

 ```{r, fig.width=6, echo=FALSE, results ="asis"}

types <- c("mpg","cyl","hp")
headers <- c("header 1","header 2")

for (i in headers) {
  
 cat(paste0("## ",i,"{.tabset} n"))

  for (j in types) {
   cat(paste0("### ",j," n"))
    plot(mtcars[j])
    cat("nn")

 }
}
```
 

Обратите внимание , что вкладка должна быть на один уровень ниже соответствующего набора вкладок (например, набор вкладок на «уровне» ## , вкладки на уровне ### ). Кроме того, график/таблица должны быть сгенерированы в кодовом блоке, а не доставлены на консоль cat() (по крайней мере, так было в моих приложениях).

Комментарии:

1. Привет! Так что, похоже, это работает для сюжета, но когда я пытаюсь вывести kable(mtcars$j) или ggplot, завернутый в ggplotly, он ничего не выводит? Даже если я оберну их функциями. Есть какие-нибудь подсказки, что здесь происходит и как я могу это решить?

2. К сожалению, у меня тоже нет решения для этого. Несколько глупым, но, возможно, рабочим решением было бы сначала сгенерировать упомянутые вами графики/таблицы и сохранить их локально (используя htmltools::save_html() , а затем импортировать локально сохраненные выходные данные HTML в RMarkdown-отчет. Однако я убежден, что есть лучшее решение.