r チャンクを明示的に構築し、それらをインラインで編成することで、コンテンツを自動生成することができましたr paste(knitr::knit(text = out))
。この驚くべきコード行は、SO の投稿で見つかりました。
私の場合、一連のグラフを作成したいと考えていました。それぞれに別のタブがあり、内容が異なります。各グラフは似ていましたが、多数 (約 15) あり、すべての個別のチャンクをコピーして貼り付けたくありませんでした。
これは、より単純な例のダウンロードできる要点です。(コードも下にありますが、\
各チャンクの前に追加して、単一のコード ブロックとしてレンダリングされるようにしたので、\
実行前に削除することに注意してください。 ) グラフを作成するためのはるかに複雑な関数を作成しましたが、R チャンクのアイデアは、要素として htmlwidgets を含むすべてのリスト オブジェクトに引き継がれます。
---
title: "Loop to Auto Build Tabs Containing htmlwidgets"
output: flexdashboard::flex_dashboard
---
\```{r setup, echo =FALSE, eval = TRUE}
library(tidyverse)
library(flexdashboard)
library(highcharter)
labels <- mtcars %>% names # these will serve as labels for each tab
# create a bunch of random, nonsensical line graphs
hcs <- purrr::map(.x = mtcars, ~highcharter::hchart(mtcars, y = .x, type = 'line')) %>%
setNames(labels) # assign names to each element to use later as tab titles
\```
Page
====================
Column {.tabset .tabset-fade}
-----------------------------
<!-- loop to build each tabs (in flexdashboard syntax) -->
<!-- each element of the list object `out` is a single tab written in rmarkdown -->
<!-- you can see this running the next chunk and typing `cat(out[[1]])` -->
\```{r, echo = FALSE, eval = TRUE}
out <- lapply(seq_along(hcs), function(i) {
a1 <- knitr::knit_expand(text = sprintf("### %s\n", names(hcs)[i])) # tab header, auto extracts names of `hcs`
a2 <- knitr::knit_expand(text = "\n```{r}") # start r chunk
a3 <- knitr::knit_expand(text = sprintf("\nhcs[[%d]]", i)) # extract graphs by "writing" out `hcs[[1]]`, `hcs[[2]]` etc. to be rendered later
a4 <- knitr::knit_expand(text = "\n```\n") # end r chunk
paste(a1, a2, a3, a4, collapse = '\n') # collapse together all lines with newline separator
})
\```
<!-- As I mentioned in the SO post, I don't quite understand why it has to be -->
<!-- 'r paste(knitr::knit(...)' vs just 'r knitr::knit(...)' but hey, it works -->
`r paste(knitr::knit(text = paste(out, collapse = '\n')))`