【发布时间】:2021-10-21 00:37:42
【问题描述】:
我已经搜索了 stackoverflow 和完整的网络,但对于这个看似简单的问题,我似乎找不到一个好的答案。
情况如下:
- 我有一个 Shiny 应用程序,与数据库连接
- 我有几个用户输入 (Pickerinputs),用户可以在其中选择多个参数
- 用户输入都相互依赖
出现的问题如下:
- 如果用户勾选了多个汽车品牌(例如,雷诺、标致和宝马),则与此选择相关联的选择器输入(这些品牌的特定汽车型号)会更新 3 次。由于许多选择器输入相互链接,这会造成混乱的用户体验。
解决方案需要
- 我觉得解决方法很简单:pickerinput只需要在input关闭后发送选择的值即可;它不需要在用户每次选择后发送值(并触发更新)。 Shinywidgets 的
AirdatePickerInput具有此特定功能(update_on=c('change', 'close')。我需要的是我的 pickerInput 在“关闭”时仅更新。因此结果值仅发送回服务器一次.
示例: 界面
ui <- fluidPage(
# Title panel
fluidRow(
column(2,
wellPanel(
h3("Filters"),
uiOutput("picker_a"),
uiOutput("picker_b"),
)
),
)
)
服务器
server <- function(input, output, session) {
# Start values for each filter
all_values_for_a <- tbl(conn, "table") %>%
distinct(a) %>%
collect()
all_values_for_b <- tbl(conn, "table") %>%
distinct(b) %>%
collect()
output$picker_a <- renderUI({
pickerInput(
inputId = "picker_a",
label = "a:",
choices = all_values_for_a,
selected = all_values_for_a,
multiple = TRUE,
options = list("live-search" = TRUE, "actions-box" = TRUE))
})
output$picker_b <- renderUI({
pickerInput(
inputId = "picker_b",
label = "b:",
choices = all_values_for_b,
selected = all_values_for_b,
multiple = TRUE,
options = list("live-search" = TRUE, "actions-box" = TRUE))
})
#I want this code to be executed ONLY when
#picker_a is closed, not everytime when the user
#picks an item in picker_a
observeEvent(
input$picker_a,
{
all_values_for_b <- tbl(conn, "table") %>%
filter(a %in% !!input$picker_a) %>%
distinct(b) %>%
collect()
updatePickerInput(session, "picker_b", choices = all_values_for_b, selected = all_values_for_b)
})
)
)
}
【问题讨论】:
标签: javascript r shiny