Создание динамических c вкладок с собственным контентом - PullRequest
2 голосов
/ 17 апреля 2020

Я пытаюсь создать приложение, которое динамически создает различные вкладки, в которых есть версия моей исходной таблицы, отфильтрованная по переменной (среди всех, выбранных CheckboxGroupInput).

Например, если я попробую с таблицей ирис , в которой есть переменная вид , принимающий 3 модальности virginita , сето и лишай , тогда я хотел бы получить первую вкладку с наблюдениями, где Species = virginita, секунду, где Species = setosa et c ...

Я нашел решение на этом форуме для динамического создания вкладки, но во всех них получен набор данных, отфильтрованный по последнему выбранному входу (здесь versicolor).

Я подозреваю, что проблема с lapply, но я новичок в R и блестящий и я не могу найти решение.

Хотелось бы получить небольшую помощь!

Спасибо всем!

library(shiny)

ui <- pageWithSidebar(
    headerPanel = headerPanel('iris'),
    sidebarPanel = sidebarPanel(checkboxGroupInput("filter","Choices",c("virginita","setosa","versicolor"), selected=c("virginita","setosa","versicolor"))
    ),

    mainPanel(uiOutput("my_tabs"))
)

server <- function(input, output, session) {
    df = iris

    output$my_tabs = renderUI({

        dt <- list()

        for ( i in 1:3) {
            output[[paste0("tab",as.character(i))]] <- DT::renderDataTable ({
                dt2 <- subset(df, Species==input$filter[i]) 
                return(dt2)
            })
            dt[[i]] <- DT::DTOutput(paste0("tab",as.character(i)))
        }

        criteria <- input$filter
        n=length(criteria)
        myTabs = lapply(1:n, function(j){
            tabPanel(criteria[j],
                     renderUI(dt[[j]])
            )

        })
        do.call(tabsetPanel, myTabs)
    })

}


runApp(list(ui = ui, server = server))

1 Ответ

1 голос
/ 17 апреля 2020

Могут возникнуть проблемы при использовании циклов for в блестящих приложениях:

https://chasemc.github.io/post/the-subtleties-of-shiny-reactive-programming-lapply-and-for-loops/

Вместо этого будет использоваться lapply.

Также, Я бы отделил ваше динамическое c создание output для разных вкладок с выражением observe (хотя вы могли бы поместить его в начало output$my_tabs).

Кроме того, я заметил, что virginica был написан с ошибкой в ​​ui. В противном случае это включает в себя большую часть вашего кода и, кажется, работает.

library(shiny)
library(DT)

ui <- pageWithSidebar(
  headerPanel = headerPanel('iris'),
  sidebarPanel = sidebarPanel(checkboxGroupInput("filter","Choices",c("virginica","setosa","versicolor"), 
                                                 selected=c("virginica","setosa","versicolor"))
  ),
  mainPanel(uiOutput("my_tabs"))
)

server <- function(input, output, session) {
  df = iris

  output$my_tabs = renderUI({
    myTabs = lapply(1:length(input$filter), function(i) {
      tabPanel(input$filter[i],
               DT::DTOutput(paste0("tab",i))       
      )
    })
    do.call(tabsetPanel, myTabs)
  })

  observe(
    lapply(1:length(input$filter), function(i) {
      output[[paste0("tab",i)]] <- DT::renderDataTable({
        subset(df, Species == input$filter[i])
      })
    })  
  ) 
}

runApp(list(ui = ui, server = server))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...