Saltar al contenido

Crear pestañas dinámicas en Rmarkdown

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 Rpero 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])) )

```

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *