在我的Shiny应用程序中创建具有CRUD功能的表单时,我遇到了一种情况,当我使用updatePickerInput
函数时,它在选择第一个输入时无法正常工作。
我已经创建了一个可重复的示例应用程序,显示这个问题。第一个代码块是正确工作的应用程序(使用命名列表中的第二个选定项目),第二个代码块具有列表中的第一个命名项目,并且此不起作用正确。这两个应用程序的区别在于变量& selected_var"已定义(代码块结束)。
要重现该问题,需要执行以下步骤:
- 在下拉菜单中选择"资产类型#1">
- 点击按钮。 正确的结果是它应该更新选择器中的选定项。在第一个例子中,这是"资产类型#2",在第二个例子中,这应该是"资产类型#1"。
#2可以,#1不行。
对于如何解决这个问题有什么想法吗?
正确的示例:
library(shiny)
library(shinyWidgets)
# Define options
# Define UI
ui <- fluidPage(
uiOutput("pickerInput"),
actionButton(inputId = "update_button", label = "Update selected option")
)
# Define server
server <- function(input, output, session) {
options_tbl <- structure(
list(
transportasset_id = c(
"a40cf288-d3c0-11ed-8b73-2e080658eb35",
"b48abb72-d3c0-11ed-8b73-2e080658eb35"
),
transportasset_name = c(
"Asset Type #1 ",
"Asset Type #2"
)
),
row.names = c(NA, -2L),
class = c(
"tbl_df",
"tbl",
"data.frame"
)
)
var_options <- setNames(options_tbl$transportasset_id, options_tbl$transportasset_name)
output$pickerInput <- renderUI(
pickerInput(inputId = "my_picker", label = "Select an option:",
choices = var_options,
selected = NULL,
options = pickerOptions(
liveSearch = TRUE,
noneSelectedText = "No commodity selected",
size = "auto",
title = "Select commodity"
)
),
)
# Function to update picker input
observeEvent(input$update_button, {
options_tbl %>% print()
selected_var <- options_tbl %>% filter(transportasset_id == "b48abb72-d3c0-11ed-8b73-2e080658eb35") %>% pull(transportasset_id)
updatePickerInput(session, "my_picker", selected = selected_var)
})
}
# Run app
shinyApp(ui = ui, server = server)
不能正常工作的例子:
library(shiny)
library(shinyWidgets)
# Define options
# Define UI
ui <- fluidPage(
uiOutput("pickerInput"),
actionButton(inputId = "update_button", label = "Update selected option")
)
# Define server
server <- function(input, output, session) {
options_tbl <- structure(
list(
transportasset_id = c(
"a40cf288-d3c0-11ed-8b73-2e080658eb35",
"b48abb72-d3c0-11ed-8b73-2e080658eb35"
),
transportasset_name = c(
"Asset Type #1 ",
"Asset Type #2"
)
),
row.names = c(NA, -2L),
class = c(
"tbl_df",
"tbl",
"data.frame"
)
)
var_options <- setNames(options_tbl$transportasset_id, options_tbl$transportasset_name)
output$pickerInput <- renderUI(
pickerInput(inputId = "my_picker", label = "Select an option:",
choices = var_options,
selected = NULL,
options = pickerOptions(
liveSearch = TRUE,
noneSelectedText = "No commodity selected",
size = "auto",
title = "Select commodity"
)
),
)
# Function to update picker input
observeEvent(input$update_button, {
options_tbl %>% print()
selected_var <- options_tbl %>% filter(transportasset_id == "a40cf288-d3c0-11ed-8b73-2e080658eb35") %>% pull(transportasset_id)
updatePickerInput(session, "my_picker", selected = selected_var)
})
}
# Run app
shinyApp(ui = ui, server = server)
我不太确定为什么在选择第一个选项时失败。我切换了transportasset_id
的值,仍然没有任何成功。除了那一件以外,一切似乎都是一样的。
在任何情况下,如果您在updatePickerInput()
中提供choices
参数,它将工作。
updatePickerInput(session, "my_picker", selected = selected_var, choices = var_options)