我正在开发一个闪亮的应用程序,它将要求用户通过选择输入窗口小部件从预加载的数据框中选择n个字符变量。为简单起见,仅使用两个字符变量(类别和品牌)创建数据框。
如果用户选择一个字符变量说类别,则会动态显示另外一个小部件,提示您选择类别级别。如果他选择两个字符变量,即类别和品牌,则两个输入窗口小部件动态显示,提示选择两者的级别。
在类别变量中,我有两个级别(护肤和护发),他们的品牌当然是不同的。
挑战是当用户在第一个输入小部件和第二个输入小部件中选择皮肤护理时,我只希望在第三个输入小部件中显示护肤品牌作为选项,如果第二个输入小部件中的头发护理则只有护发品牌在第三个输入小部件。如果在第二个输入小部件中都选择了两个,那么在第三个输入小部件中只有所有品牌都可以选择。
我正在努力解决这些问题,也无法以任何其他方式做到这一点 请建议。
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)),
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)