我在shiny
模块内的嵌套selectInput
遇到问题。
考虑以下最小样本应用
library(shiny)
options <- list(A = 1:3, B = 4:6)
module_ui <- function(id) {
ns <- NS(id)
tagList(
selectInput(ns("option1"), "Option 1", choices = LETTERS[1:2]),
selectInput(ns("option2"), "Option 2", choices = NULL))
}
module_server <- function(id) {
moduleServer(
id,
function(input, output, session) {
observe({
updateSelectInput(
session, "option2", choices = options[[input$option1]])
})
return(list(
option1 = reactive(input$option1),
option2 = reactive(input$option2)))
}
)
}
ui <- fluidPage(
module_ui("module"),
textOutput("text")
)
server <- function(input, output, session) {
sel <- module_server("module")
output$text <- renderText({
req(sel$option1(), sel$option2())
print(paste0(sel$option1(), sel$option2(), collape = ""))
paste0(sel$option1(), sel$option2(), collape = "")
})
}
shinyApp(ui, server)
我的问题可以在执行以下操作时重现:
- 保留条目"A";从";选项1";以及条目";1〃;从";选项2";("选项2"的条目基于"选项1"中当前选择的条目)
- 然后选择条目";B";从";选项1">
这不会立即清除和更新";选项2";。相反,在短时间内,来自module_server
的reactive
返回值给出不存在的"0";选项1"-"选项2";组合";B1〃;(请参阅示例应用程序中的终端输出);这仅在"0"中的条目之前非常短暂地发生;选项2";然后经由CCD_ 5正确地更新。问题是,模块返回的任何不存在的值组合都会导致下游出现问题/错误。
《处理嵌套选择输入和模块》一文描述了一个非常相似的问题,但我发现解决方案在我的案例中有问题。除其他外,我希望该模块能够处理输入的验证。
当我在主ui
中放置selectInput
并在主server
中使用updateSelectInput
时,我没有这个问题。不知怎的,CCD_ 11的返回自变量中的两个CCD_;太快";。在返回module_server
中的输入之前,是否有方法验证/检查这些输入。
这里有一个解决方案。您可以在第二个无功输出中明确地使用req()
进行验证。即
module_server <- function(id) {
moduleServer(
id,
function(input, output, session) {
observe({
updateSelectInput(
session, "option2", choices = options[[input$option1]])
})
return(list(
option1 = reactive(input$option1),
option2 = reactive({
req(input$option2 %in% options[[input$option1]])
input$option2
})))
}
)
}
它基本上会停止下游的任何反应,直到条件得到满足。