Hola, hemos encontrado la solución a tu pregunta, has scroll y la hallarás más abajo.
Solución:
También hay una solución simple de rmarkdown para este problema que no requiere javascript brillante y/o personalizado. No funciona para todos los tipos de salida R (ver más abajo):
## Tabbed Example .tabset
```r, results = 'asis'
for (nm in unique(iris$Species))
cat("### ", nm, "n")
cat(knitr::knit_print(plot(iris[iris$Species == nm, ])))
cat("n")
```
Un método más complicado, que primero crea una lista de código Rmarkdown sin procesar como una lista de vectores de caracteres, que luego se evalúan en un fragmento de código separado (en línea) con knitr::knit()
. Esto funciona para todo tipo de resultados, no solo para gráficos base.
## Tabbed Example ggplot .tabset
```r
library(ggplot2)
template <- c(
"### nmn",
"```r, echo = FALSEn",
"ggplot(iris[iris$Species == 'nm', ], aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()n",
"```n",
"n"
)
plots <- lapply(
unique(iris$Species),
function(nm) knitr::knit_expand(text = template)
)
```
`r knitr::knit(text = unlist(plots))`
Por lo que sé, lo que está tratando de hacer no es posible en rmarkdown (pero me encantaría que me corrijan). Pero, por supuesto, podemos implementar una función para hacer precisamente eso.
Basé mi respuesta en esta respuesta de @KRohde, por lo que todos los créditos son para él. Simplemente lo adapté para que funcione en un documento de rebajas más simple.
La respuesta es principalmente construir con JS
en vez de R
pero como la rebaja es principalmente una HTML
Siento JS
es una mejor herramienta.
Aquí está el código:
---
output: html_document
---
```r echo=FALSE, results='asis'
library(shiny)
addToTabset <- function(title, tabsetId, Panel)
tags$script(HTML(paste0("
/* Getting the right tabsetPanel */
var tabsetTarget = document.getElementById('", tabsetId, "');
/* Creating 6-digit tab ID and check, whether it was already assigned. */
hrefCode = Math.floor(Math.random()*100000);
/* Creating node in the navigation bar */
var navNode = document.createElement('li');
var linkNode = document.createElement('a');
linkNode.appendChild(document.createTextNode('", title, "'));
linkNode.setAttribute('data-toggle', 'tab');
linkNode.setAttribute('data-value', '", title, "');
linkNode.setAttribute('href', '#tab-' + hrefCode);
navNode.appendChild(linkNode);
tabsetTarget.appendChild(navNode);
setTimeout(function()
var tabContent = document.createElement('div');
var tabContainerTarget = document.getElementsByClassName('tab-content')[0];
tabContent.setAttribute('id', 'tab-' + hrefCode);
tabContent.setAttribute('class', 'tab-pane')
tabContent.innerHTML = '", gsub('n', '', Panel, fixed = T), "';
tabContainerTarget.appendChild(tabContent);
, 100);
")
))
```
El código anterior debe permanecer en un 'fragmento de configuración', ya que define un R
función para llamar a JS
función que en su mayoría solo agrega las cosas correctas al DOM.
A continuación, se puede utilizar cuando sea necesario, pasando el tabPanel
título, el 'objetivo' tabset
y lo normal tabPanel
función.
```r results='asis', echo=FALSE
shiny::tabsetPanel(id = 'tbSet1',
shiny::tabPanel('Tab 1', 'foo'),
shiny::tabPanel('Tab 2', 'bar')
)
```
```r results='asis', echo=FALSE
addToTabset(title = 'Tab 3',
tabsetId = 'tbSet1',
tabPanel(
h1('This is a title'),
actionButton('btn',label = 'Clicky button'),
radioButtons('asd', LETTERS[1:5], LETTERS[1:5])) )
```