【问题标题】:SelectInput Value update based on previous SelectInput in R shinySelectInput 值更新基于 R 中以前的 SelectInput 闪亮
【发布时间】:2018-07-09 04:53:32
【问题描述】:

下面的 R shiny 脚本创建了三个 selectInput,每个 selectInput 的值取决于前一个 selectInput 的输入值。例如。在脚本中的数据中,“value”列的值取决于“Candy”列,“Candy”列的值取决于“Brand”。问题是,无论我在“品牌”列中选择“火星”还是“荨麻”值,对应的“糖果”值“100Grand”都是相同的,因此我看不到值列中的变化selectInput 正在读取相同的值。请帮我解决这个问题,还请确保脚本不会变慢。谢谢。

candyData <- read.table(
text = "
Brand       Candy           value
Mars        100Grand        Choc1
Netle       100Grand        Choc2
Nestle      Crunch          Choc3",
header = TRUE,
stringsAsFactors = FALSE)
library(shiny)
library(shinydashboard)
submenuUI <- function(id) {
ns <- NS(id)
tagList(
box(title = "Data", status = "primary", solidHeader = T, width = 12,
    fluidPage(
      fluidRow(

        column(2,offset = 0, style='padding:1px;',

selectInput(ns("Select1"),"select1",unique(candyData$Brand))),
        column(2,offset = 0,

style='padding:1px;',selectInput(ns("Select2"),"select2",choices = NULL)),
        column(2, offset = 0,

style='padding:1px;',selectInput(ns("Select3"),"select3",choices=NULL ))
      )))
)
}
submenuServ <- function(input, output, session){
observeEvent(input$Select1,{
updateSelectInput(session,'Select2',
choices=unique(candyData$Candy[candyData$Brand==input$Select1]))
})
observeEvent(input$Select2,{
updateSelectInput(session,'Select3',
choices=unique(candyData$value[candyData$Brand==input$Select1 &
candyData$Candy==input$Select2]))
})
}
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
  shinyjs::useShinyjs(),
  id = "tabs",
  menuItem("Charts", icon = icon("bar-chart-o"),
           shinyjs::hidden(menuSubItem("dummy", tabName = "dummy")),
           menuSubItem("Sub-item 1", tabName = "subitem1")
  ))),
dashboardBody(
tabItems(tabItem("dummy"),
         tabItem("subitem1", submenuUI('submenu1'))
)
))
server <- function(input, output,session) {
callModule(submenuServ,"submenu1")
}
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny shinydashboard shinyapps


    【解决方案1】:

    您只需在您的observeEvent 中添加input$Select1 即可更新select3

    submenuServ <- function(input, output, session){
        observeEvent(input$Select1,{
            updateSelectInput(session,'Select2',
                              choices=unique(candyData$Candy[candyData$Brand==input$Select1]))
        })
        observeEvent(c(input$Select1, input$Select2),{
            updateSelectInput(session,'Select3',
                              choices=unique(candyData$value[candyData$Brand==input$Select1 &
                                                                 candyData$Candy==input$Select2]))
        })
    }
    

    如果需要,您可以将observeEvent 转换为observe

    observe({
        updateSelectInput(
            session, 'Select3',
            choices= unique(candyData$value[candyData$Brand==input$Select1 & candyData$Candy==input$Select2])
        )
    })
    

    【讨论】:

    • 我不知道如何理解然后你可以将你的observeEvent转换为observe
    • observeEvent & observe 实际上是一样的。唯一的区别是您选择reactive 表达式来触发observeEvent 的上下文,而observer 中的每个reactive 表达式都会触发上下文。
    猜你喜欢
    • 2015-05-07
    • 2015-10-27
    • 2022-01-15
    • 2019-03-18
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2018-07-25
    相关资源
    最近更新 更多