R中闪亮:选定的输入被清除

时间:2018-04-08 21:51:54

标签: r select shiny

我正在使用两个selectizeInput在R中构建一个简单的Shiny App,您可以从3个代理商的列表中选择代理商,从9个运输商的列表中选择运输商。我的应用程序有一个奇怪的行为,它清除了用户的选择。

假设我没有选中“全选”,而是从代理商列表中选择一些内容(例如,代理商A),如下所示

enter image description here

然后从Transporters列表中选择一些内容(例如Transporter A2和Transporter B2),而不是选中“Select All”。

enter image description here

这里发生了一件奇怪的事。当我再次回到代理商名单时,我的选择(代理商A)以某种方式被清除。

enter image description here

如果有人告诉我这种奇怪行为的原因是什么,以及如何解决这个问题,我真的很感激!

我的数据看起来像这样。

Agencies    Transporters    Ontime_rate
agency A    Transporter A1  2       
agency A    Transporter A2  5       
agency A    Transporter A3  7       
Agency B    Transporter B1  3       
Agency B    Transporter B2  5       
Agency B    Transporter B3  7       
Agency C    Transporter C1  8       
Agency C    Transporter C2  4       
Agency C    Transporter C3  10  

ui.R

library(shiny)
library(shinydashboard)

header <- dashboardHeader()

# Sidebar elements for the search visualizations
sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem(text = h5('Agencies'),
             checkboxInput('bar_agen', 'Select All', value = TRUE),
             selectizeInput('agen', label = '', choices = c(), multiple = TRUE)
             ),

    menuItem(text = h5('Transporters'),
             checkboxInput('bar_trans', 'Select All', value = TRUE),
             selectizeInput('trans', label = '', choices = c(), multiple = TRUE)
    )
  )
)


body <- dashboardBody(
  fluidRow(
    box(plotOutput("distPlot"))
  )
)

dashboardPage(title ='Dashboard', header, sidebar, body)

server.R

library(shiny)
library(dplyr)
library(ggplot2)

data <- read.csv("data.csv")

shinyServer(function(input, output, session) {

  ggplot(data, aes(input$agen, y = Ontime_rate)) + geom_bar(stat="identity")

  output$distPlot <- renderPlot({

    ggplot(data = data) + geom_histogram()

    observe({

      updateSelectizeInput(session,
                           'agen',
                           label = NULL,
                           choices = data$Agencies,
                           selected = if (input$bar_agen) data$Agencies)

      updateSelectizeInput(session,
                           'trans',
                           label = NULL,
                           choices = data$Transporters,
                           selected = if (input$bar_trans) data$Transporters)
      })
  })
})

*此应用尚未完成(它不会返回dashboardBody中的任何图。)但我认为这与此问题无关。请关注侧边栏输入。

1 个答案:

答案 0 :(得分:0)

observe中放置renderPlot语句在这种情况下没有意义。相反,你想确保

  1. 代理机构的选择取决于代理机构的复选框
  2. 转运蛋白的选择取决于转运蛋白的复选框。
  3. 您可以为该

    使用两个单独的observeEvent语句
    observeEvent(input$bar_agen, {
      updateSelectizeInput(session, 'agen', label = NULL, choices = data$Agencies,
                           selected = if (input$bar_agen) data$Agencies
      )
    })
    
    observeEvent(input$bar_trans, {
      updateSelectizeInput(session, 'agen', label = NULL, choices = data$Transporters,
                           selected = if (input$bar_trans) data$Transporters
      )
    })
    

    您编码的方式,两个复选框的更新事件在哪里耦合,因此第一个selectInput被第二个checkboxInput重置,反之亦然。