【发布时间】:2019-06-14 06:27:48
【问题描述】:
我正在 mtcars 数据上构建一个 shinyApp。我在 selectInput 按钮 中遇到问题。当我单击左侧的 disp 按钮 时,我没有选择。我只得到全部。 同样,当我将一些值放入 carb 过滤器,然后从 vs filter 中选择另一个值时,carb 和 disp 立即重置为“All”不应该发生。 carb 和 disp 中先前选择的值如果存在于 vs 选择值中,则应保留。 有人可以看看我的代码。我将不胜感激。
library(readr)
library(shiny)
library(DT)
library(dplyr)
library(shinythemes)
library(htmlwidgets)
library(shinyWidgets)
library(shinydashboard)
data_table<-mtcars
#ui
ui = fluidPage(
sidebarLayout(
sidebarPanel (
uiOutput("vs_selector"),
uiOutput("carb_selector"),
uiOutput("disp_selector")),
mainPanel(
DT::dataTableOutput('mytable') )))
#server
server = function(input, output, session) {
output$vs_selector <- renderUI({
selectInput(inputId = "vs",
label = "vs:", multiple = TRUE,
choices = c( unique(data_table$vs)),
selected = c(0,1))
})
output$carb_selector <- renderUI({
available0 <- data_table[c(data_table$vs %in% input$vs ), "carb"]
selectInput(
inputId = "carb",
label = "carb:",
multiple = TRUE,
choices = c('All',as.character(unique(available0))),
selected = 'All')
})
output$disp_selector <- renderUI({
available <- data_table[c(data_table$carb %in% input$carb &
data_table$vs %in% input$vs), "disp"]
selectInput(
inputId = "disp",
label = "disp:",
multiple = TRUE,
choices = c('All',as.character(unique(available))),
selected = 'All')
})
thedata <- reactive({
data_table<-data_table[data_table$vs %in% input$vs,]
if(input$carb != 'All'){
data_table<-data_table[data_table$carb %in% input$carb,]
}
if(input$disp != 'All'){
data_table<-data_table[data_table$disp %in% input$disp,]
}
data_table
})
output$mytable = DT::renderDataTable({
DT::datatable( {
thedata() # Call reactive thedata()
})
})}
shinyApp(ui = ui, server = server)
【问题讨论】:
-
这里的问题在于
selectInput中的selected参数。例如,在carb, disp选择器中,vs选择器的每次更改都会将剩余的选择器重置为All,因为这些选择器中的选项列表依赖于从vs选择器中选择的值。 -
在 vs 选择器中,提及
selected = c('1','2')没有意义,原因有两个。首先,c( unique(as.character(data_table$vs)))将为您提供 (0, 1),因此您不能将其设置为 (1,2)。其次,唯一值不是使用引号的字符串/字符数据类型 -
非常感谢伙计,我做了这些更改并更新了我的代码。但我仍然有同样的问题。你能看看吗
-
你想要逐步过滤 - 比如先 vs 然后 carb 然后 disp? disp 也是一个数值,为什么要为它提供一个下拉列表?
-
是的,我想要一步一步的过滤器。它只是一个虚拟数据,我的原始数据有不同的变量,这就是我把 disp 放在这里的原因。如果需要,您可以放置任何其他变量而不是 disp
标签: r input shiny shinydashboard dt