Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript updateSelectInput而不触发事件_Javascript_R_Shiny - Fatal编程技术网

Javascript updateSelectInput而不触发事件

Javascript updateSelectInput而不触发事件,javascript,r,shiny,Javascript,R,Shiny,在我的闪亮应用程序中,我有两个SelectInput对象,它们的选项在这两个对象之间相互依赖(两个列表中都可以有多个选项) 当我与小部件A交互时,小部件B中可能存在不再适用的选项,因此我希望相应地更新小部件B中的选项和选项 是否有一种方法可以使用不触发事件的updateSelectInput更新选项和选择?换句话说,有没有办法避免使input$widgetB无效 编辑: 下面的例子显示了我的问题 我使用browser()跟踪反应链。如果小部件B仅选择了“X”,则小部件A应仅显示“A”和“B”作为

在我的闪亮应用程序中,我有两个SelectInput对象,它们的选项在这两个对象之间相互依赖(两个列表中都可以有多个选项)

当我与小部件A交互时,小部件B中可能存在不再适用的选项,因此我希望相应地更新小部件B中的选项和选项

是否有一种方法可以使用不触发事件的updateSelectInput更新选项和选择?换句话说,有没有办法避免使
input$widgetB
无效

编辑:

下面的例子显示了我的问题

我使用
browser()
跟踪反应链。如果小部件B仅选择了“X”,则小部件A应仅显示“A”和“B”作为选项(即,“C”不再是选项)。类似地,如果小部件A只选择了“C”,那么小部件B应该只显示“Y”和“Z”作为选项(即,“X”不再是选项)。由于其设置方式,反应链最终将所有选择还原为初始设置。如果有一种方法可以让
updateSelectInput
在选项/选择发生变化时停止使相关小部件无效(请注意,
updateSelectInput
足够聪明,如果我们用相同的值替换当前的选项/选择,则不会使相关小部件无效),我认为我不会遇到这个问题

你知道我怎样才能达到预期的结果吗

library(shiny)

ui <- fluidPage(
  selectInput(
    "WidgetA",
    label = h3("Widget A"),
    choices = c("A", "B", "C"),
    selected = c("A", "B", "C"),
    multiple = TRUE
  ), 
  selectInput(
    "WidgetB",
    label = h3("Widget B"),
    choices = c("X", "Y", "Z"),
    selected = c("X", "Y", "Z"),
    multiple = TRUE
  ),
  tableOutput("table")
)

server <- function(input, output, session) {

  D <- data.frame(A = c("A","A","B","B","B","C","B","C","C","A"),
                  B = c("X","Y","Z","X","Y","Z","X","Y","Z","X"),
                  x = 1:10
                  )

  observeEvent(input$WidgetA,{
    # browser()

    B_choices <- unique(D$B[D$A %in% input$WidgetA])

    # Does not trigger update (i.e., it does not invalidate input$WidgetB) if choices AND selections remain the same
    updateSelectInput(session, "WidgetB", choices = B_choices, selected = B_choices)

    D_ <- D[D$A %in% input$WidgetA & D$B %in% input$WidgetB,]

    output$table <- renderTable(D_)
  })

  observeEvent(input$WidgetB,{
    # browser()

    A_choices <- unique(D$A[D$B %in% input$WidgetB])

    # Does not trigger update (i.e., it does not invalidate input$WidgetA) if choices AND selections remain the same
    updateSelectInput(session, "WidgetA", choices = A_choices, selected = A_choices)

    D_ <- D[D$A %in% input$WidgetA & D$B %in% input$WidgetB,]

    output$table <- renderTable(D_)
  })

}

shinyApp(ui = ui, server = server)
库(闪亮)

ui您可以在things的服务器端使用renderUI来呈现一个selectInput,它依赖于另一个的值。然后,您可以使用uiOutput函数将其添加到UI中:

library(shiny)

ui <- fluidPage(

  selectInput(
    "widgetA",
    label = h3("Widget A"),
    choices = c(1,2,3,4)
  ),
  uiOutput("select2")
  )

server <- function(input, output) {
   output$select2 <- renderUI({
     if(input$widgetA %in% c(1,2)) {
    selectInput(
      "WidgetB",
      label = h3("Widget B"),
      choices = c("A", "B", "C")
    ) }
    else {
      selectInput(
        "WidgetB",
        label = h3("Widget B"),
        choices = c("X", "Y", "Z")
      )
    } 
  })
}
shinyApp(ui = ui, server = server)
库(闪亮)

ui请求帮助时,您应该包括一个简单的示例输入和所需的输出,可用于测试和验证可能的解决方案。在没有代码的情况下很难谈论具体的解决方案。请注意,一定要了解您需要的所有内容(没有可复制的最小示例),但您似乎在寻找
隔离
功能,该功能允许您停止反应,请查看Rstudio的文档,谢谢您的评论。我用一个具体的例子更新了这个问题。谢谢你的回答。我添加了一个示例,以便更具体、更清楚地说明我的问题是什么。