下面有一个闪亮的应用程序,用户可以在其中从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)
答案 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
。