Criando painéis dentro de tabsetPanels usando purrr::map

Pessoal

Como consigo criar painéis dentro de tabsetPanels no shiny utilizando as map functions?

Eu preciso q seja na UI, mas não estou conseguindo.

Segue meu código:

library(shiny)

ui <- fluidPage(


  tabsetPanel('one',
              map(1:3,
                 ~ tabPanel(paste0("panel_",.x))
                  )
              )
)


server <- function(input, output, session) {

}

shinyApp(ui, server)

Laura,

Tem dois probleminhas com o seu código: o primeiro é que você não declarou o id do tabsetPanel() e o segundo é que você está passando uma lista para uma função que recebe dots (os três pontinhos).

Essa questão do dots é meio sutil… É só pensar no mutate(): você faz mutate(coluna = x, coluna2 = y), não mutate(list(coluna = x, coluna2 = y)). No seu código, você está executando algo parecido com o segundo caso, passando a lista que sai do map() para a função tabsetPanel(). Se você quiser converter uma função que recebe dots para uma função que recebe uma lista, você pode usar purrr::lift_dl() como no código abaixo.

library(purrr)
library(shiny)

# Faz o lift e já preenche o ID do painel
liftTabsetPanel <- lift_dl(tabsetPanel, id = 'one')

ui <- fluidPage(
  liftTabsetPanel(map(1:3, ~ tabPanel(paste0("panel_",.x))))
)


server <- function(input, output, session) {

}

shinyApp(ui, server)

Obrigada!

Há alguma relação entre a função do.call e esse função do purrr lift_dl?

A do.call() funciona de um modo muito parecido com a lift_dl(): a primeira recebe uma função e aplica ela a uma lista de argumentos, enquanto a segunda cria uma nova função que é capaz de lidar diretamente com uma lista de argumentos. As vantagens de usar a lift_dl() são a possibilidade de pré-preencher argumentos na hora de fazer o lift (como eu fiz com id) e o fato de ela ter várias irmãs que funcionam de um jeito muito parecido.

O código com do.call() ficaria assim:

library(purrr)
library(shiny)

ui <- fluidPage(
  do.call(tabsetPanel, c(
    id = "one",
    map(1:3, ~ tabPanel(paste0("panel_",.x)))
  ))
)

server <- function(input, output, session) {

}

shinyApp(ui, server)
1 curtida