【发布时间】:2018-11-21 19:33:07
【问题描述】:
我正在开发一个闪亮的应用程序,其中选择输入的选择应该根据之前的输入动态更新。
例如,如果在第一个输入小部件中同时选择了类别和细分,并且在第二个输入小部件中只选择了 skin_care,则药物和非药物 应该作为第三个输入小部件中的选项,而不是段的所有唯一名称。 如果在第二个输入小部件中选择了 hair_care 而不是 skin_care,则应该在第三个输入小部件下拉列表中选择 Gents and Ladies。 所以基本上从下拉列表中选择的选择取决于用户在早期输入小部件上选择的内容。品牌也一样。 在这里,我假设维度的选择总是从左到右。
实际应用会要求用户加载数据,它可以有 10 个维度,也可能更多。为简单起见,我保留了三个。
library(shiny)
library(DT)
ui <- shinyUI(fluidPage(
tabsetPanel(
tabPanel("Data", fluid = TRUE,
sidebarLayout(
sidebarPanel(p("Please remove None first"),
uiOutput("dim"),
uiOutput("levels1")),
mainPanel(
DT::dataTableOutput("data_display")
))))))
server <- shinyServer(function(input,output){
# creating Data
data <- reactive({
data <- data.frame(Date = as.Date(c("2018-05-25","2018-05-26")),
category = c(rep("skin_care",6),rep("hair_care",6)),
Segment = c(rep("Medicated",4),rep("Non_Medicated",2),
rep("Ladies",4),rep("Gents",2)),
Brand = c("X","X","Y","Y","Z","Z","A","A","B","B","C","C"),
sales = round(rnorm(12,100,3)))
})
# Displaying Data
output$data_display <- DT::renderDataTable(
datatable(data(),options = list(pageLength = 12),rownames = FALSE)
)
# selects dimension (Only character variable to be selected)
output$dim<-renderUI({
b<-colnames(data()[sapply(data(),class)=="character"])
selectInput("x","Select only character variable",choices =
c("NONE",b[1:length(b)]),selected="NONE",multiple = TRUE)
})
# user selects levels of dimension
output$levels1<-renderUI({
if(is.null(input$x)){
return(NULL)
}
else if(sum(input$x=="NONE")==1){
return(NULL)
}
else{
lapply(seq(input$x),function(i){
selectInput(inputId = paste0("range",i),
paste0("Select level of ",input$x[i]),
choices = c(unique(data()[,input$x[i]]),"ALL"),multiple = TRUE)
})
}
})
})
shinyApp(ui,server)
编辑:在动态出现的 selectinput 小部件的下拉菜单中提供选项
【问题讨论】:
-
使用观察...观察将对每个未隔离的输入$变量做出反应..
-
您能说明一下用户菜单 (ui) 应该做什么吗?应该是向下钻取吗?就像您选择类别,然后弹出一个带有 skin_care 和 hair_care 的新下拉列表?或者它应该是一个if-else-thing?比如如果你选择
category和brand那你只能选择有护肤品的品牌吗?你的措辞不清楚。编辑问题。制作更短的句子。如果可能,请枚举。谢谢 -
@ 5th 是的,这就像向下钻取。如果在第一个输入小部件中同时选择了类别和品牌名称,则 skin_care 和 hair_care 都将是一个选项,用户可以选择一个或两个。如果只选择 skin_care 或 hair_care,则相应的品牌名称应该是第三个下拉列表中的一个选项,而不是所有品牌名称。
-
我在
ui部分中使用了多个uiOutput语句,并在server中使用了相应的renderUI语句。renderUI使用反应对象和input在selectInput菜单中显示正确的选项。这是你要找的吗? -
@Gautam 不,如果有很多字符变量,多个 uiOutput 将是一个挑战。然后侧栏将填充许多输入小部件。我想让它动态如果用户想要任何维度,那么只会出现更多的下拉菜单。