基于对另一个闪亮小部件的选择来创建一个或多个闪亮小部件

时间:2020-09-04 16:16:26

标签: r shiny

下面有一个闪亮的应用程序,用户可以在其中从dt数据中选择一个或多个列名。

name<-c("John","Jack","Bill")
value1<-c(2,4,6)
add<-c("SDF","GHK","FGH")
value2<-c(3,4,5)
dt<-data.frame(name,value1,add,value2)

然后,他所做的每个选择都将在相对位置selectInput()下显示。也许我可以在每种情况下都使用if,但是问题是我的真实数据集可能更大,并且每次都有不同的列名,因此我正在寻找一种方法,可以立即将pickerInput()选择的名称与创建将包含列值的相对selectInput()。例如,如果某人选择所有4个列名,则应使用相对列名作为标签创建4个selectInputs。

library(shiny)
library(shinyWidgets)

# ui object
ui <- fluidPage(
    titlePanel(p("Spatial app", style = "color:#3474A7")),
    sidebarLayout(
        sidebarPanel(
            pickerInput(
                inputId = "p1",
                label = "Select Column headers",
                choices = colnames( dt),
                multiple = TRUE,
                options = list(`actions-box` = TRUE)
            ),
            uiOutput("widg")
            
            
        ),
        
        mainPanel(
            
        )
    )
)

# server()
server <- function(input, output) {
   
    output$widg<-renderUI({
        
    })
    
   
}

# shinyApp()
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

高级别,我会在UI中静态创建selectInput,并在选择器更改时考虑使用updateSelectInput。大致是这样的(请注意,在服务器功能中添加了session变量):

ui <- fluidPage(
  titlePanel(p("Spatial app", style = "color:#3474A7")),
  sidebarLayout(
    sidebarPanel(
      pickerInput(
        inputId = "p1",
        label = "Select Column headers",
        choices = colnames( dt),
        multiple = TRUE,
        options = list(`actions-box` = TRUE)
      ),
      selectInput("columnValues", "", choices = "")
      
      
    ),
    
    mainPanel(
      
    )
  )
)

# server()
server <- function(input, output, session) {
  
  observeEvent(input$p1, {
    
    updateSelectInput(
      session, 
      inputId = "columnValues", 
      label = paste0("Choose from: ", input$p1),
      choices = dt[[input$p1]]
    )
    
  })
  
  
}

# shinyApp()
shinyApp(ui = ui, server = server)

我也注意到您使用的是多选选择器,所以你将不得不修改如何,仅在选择多个表头(也如何产生标签)的列值获得串联。

如果在选择器中未选择任何内容时,您不希望selectInput可见,则可以使用多种方法来切换其可见性,例如使用conditionalPanel