r-从闪亮模块内的嵌套"selectInput"返回值



我在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)

我的问题可以在执行以下操作时重现:

  1. 保留条目"A";从";选项1";以及条目";1〃;从";选项2";("选项2"的条目基于"选项1"中当前选择的条目)
  2. 然后选择条目";B";从";选项1">

这不会立即清除和更新";选项2";。相反,在短时间内,来自module_serverreactive返回值给出不存在的"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
})))
}
)
}

它基本上会停止下游的任何反应,直到条件得到满足。

相关内容

  • 没有找到相关文章

最新更新