0

の値に依存するリアクティブなtabPanel / tabPanelsを使用して単純なアプリを作成したいと思いますselectInput(すでにここで解決策を見つけました)。さらに、このウィジェットで 1 つの値を選択すると、フィルターとしても機能するさまざまな数の tabPanels が表示されます。たとえば、私のアプリではdiamondsデータセットを使用しています。「非常に良い」という単語を選択すると、この値を持つすべての行を含むデータセットが表示されます。その上部にはcolor、フィルター処理されたデータセットのすべての一意の値も表示されます。私が達成したいのは、上記の tabPanels を使用してもう一度フィルタリングできるようにすることです。

library(shiny)
library(shinyTree)
library(dplyr)
library(DT)
library(ggplot2)

diamonds_test <- sample_n(diamonds, 100)
diam_cut <- 
  list(
    `Very Good` = "Very Good",
    Ideal = "Ideal",
    Fair = "Fair",
    Premium = "Premium",
    Good = "Good"
  )

runApp(list(
  ui = pageWithSidebar(
    headerPanel('Dynamic Tabs'),
    sidebarPanel(
      selectInput('name','',choices = diam_cut)
    ),
    mainPanel(
      uiOutput('mytabs'),
      dataTableOutput('table')
    )
  ),
  server = function(input, output, session){

    output$mytabs = renderUI({
      colorVector <- diamonds_test %>%
        filter(cut == input$name) %>% 
        distinct(color) %>% 
        .[['color']] %>% 
        as.character()

      myTabs = lapply(colorVector, tabPanel)
      do.call(tabsetPanel, c(myTabs, type = 'pills'))
    })

    output$table <- renderDataTable({
      data <- diamonds_test %>%
        filter(cut == input$name)
      datatable(data)
    })
  }
))
4

1 に答える 1

0

数時間検索してさまざまな構成を試した後、達成したいものを作成しました。

library(shiny)
library(shinyTree)
library(dplyr)
library(DT)

diamonds_test <- sample_n(diamonds, 100)
diam_cut <- 
  list(
    `Very Good` = "Very Good",
    Ideal = "Ideal",
    Fair = "Fair",
    Premium = "Premium",
    Good = "Good"
  )

runApp(list(
  ui = pageWithSidebar(
    headerPanel('Dynamic Tabs'),
    sidebarPanel(
      selectInput('name','',choices = diam_cut)
    ),
    mainPanel(
      uiOutput('mytabs')
    )
  ),
  server = function(input, output, session){

    colorVector <- reactive({
      colorVector <- diamonds_test %>%
        filter(cut == input$name) %>% 
        distinct(color) %>% 
        .[['color']] %>% 
        as.character()
    })

    output$mytabs <- renderUI({
      colorVector_use <- colorVector()
      myTabs = lapply(colorVector_use, tabPanel)

      do.call(tabsetPanel,
              c(type = 'pills',
                lapply(colorVector_use, function(x) {
                  call("tabPanel",x ,call('dataTableOutput',paste0("table_",x)))
                })
              ))
    })

    data <- reactive({
      df <- diamonds_test %>% 
        filter(cut == input$name)
    })

    observe({
      if (!is.null(colorVector())){
        lapply(colorVector(), function(color_value){
          output[[paste0('table_',color_value)]] <- renderDataTable(
            data() %>% filter(color == color_value))
        })
      }
    })
  }
))
于 2016-03-14T06:45:49.977 に答える