我正在使用两个selectizeInput
在R中构建一个简单的Shiny App,您可以从3个代理商的列表中选择代理商,从9个运输商的列表中选择运输商。我的应用程序有一个奇怪的行为,它清除了用户的选择。
假设我没有选中“全选”,而是从代理商列表中选择一些内容(例如,代理商A),如下所示
然后从Transporters列表中选择一些内容(例如Transporter A2和Transporter B2),而不是选中“Select All”。
这里发生了一件奇怪的事。当我再次回到代理商名单时,我的选择(代理商A)以某种方式被清除。
如果有人告诉我这种奇怪行为的原因是什么,以及如何解决这个问题,我真的很感激!
我的数据看起来像这样。
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
中的任何图。)但我认为这与此问题无关。请关注侧边栏输入。
答案 0 :(得分:0)
在observe
中放置renderPlot
语句在这种情况下没有意义。相反,你想确保
您可以为该
使用两个单独的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
重置,反之亦然。