R Shiny:将多个连续的反应传递给 selectInput

Posted

技术标签:

【中文标题】R Shiny:将多个连续的反应传递给 selectInput【英文标题】:R Shiny: passing multiple, succesive reactives to selectInput 【发布时间】:2014-12-03 18:48:13 【问题描述】:

我一直在尝试扩展 Ramnath 发布的第二个解决方案(使用 updateSelectInput 的解决方案)在最初发布于 R shiny passing reactive to selectInput choices 的问题中。我想允许用户从一系列层次结构的输入中选择输入,其中每个选择中的选择会更新下一个选择中的可能值。例如,在下面我通过简单地添加第三个输入来修改 Ramnath 的代码,该输入列出了在第二个输入中选择的变量的值。此示例基于 mtcarsiris 数据集,并在 R v 3.1.1 和 RStudio v 0.98.1062 上运行。它不会引发错误,但您会发现我一直在纠结如何添加第二个 reactive(),它的输入是 input$datasetinput$column 的组合。

library(shiny)

runApp(list(

  ui = bootstrapPage(
    selectInput('dataset', 'Choose data set', c('mtcars', 'iris')),
    selectInput('columns', 'Choose variable', ""),
    selectInput('values', 'Show values', "")
  ),

  server = function(input, output, session)

    # updates variable names based on selected dataset 
    outVar = reactive(
      names(get(input$dataset))
    )

    # i want this to update the values of the selected variable
    outVar2 = reactive(
      sort(unique(get(input$dataset)[, 2]))  # this works but of course I don't want the second variable every time
      #sort(unique(get(input$dataset)[, input$columns]))   # this fails but this is the idea I'm after
    )

    # i want these to update the UI based on the reactive output above 
    observe(
      updateSelectInput(session, "columns", choices = outVar())
      updateSelectInput(session, "values", choices = outVar2())
    )       
  
))

【问题讨论】:

R shiny passing reactive to selectInput choices 的可能重复项,一种方法是将selectInput 包装在服务器端的renderUI 中。 【参考方案1】:

回答我的第一个问题。似乎这很旧,但由于过去一周我一直在玩 Shiny,我想我会直接帮助回答这个问题。

要直接回答这个问题,sort(unique(get(input$dataset)[, input$columns])) 语句不会失败,它是observe 语句。因为outVar()outVar2() 都在observe 语句中,所以observe 语句将在任一变量更新时运行。因此,当更改第二个selectInputinput$columns 变量)时,实际上会导致第一个selectInput 通过updateSelectInput(session, "columns", choices = outVar()) 更新。

然后,这会将列下拉列表重置为原始选择,使应用程序看起来好像已损坏。要在慢动作中看到这一点,我建议在 observe 语句中添加一个 browser() 调用来说明代码的逐步执行方式:

observe(
  browser()
  updateSelectInput(session, "columns", choices = outVar())
  updateSelectInput(session, "values", choices = outVar2())
)

总体而言,我将 observe 语句分解为 2 个 observeEvent 语句(当我更改数据集时,仅将语句分解为两个单独的 observe 语句时出现错误)。通过将 updateSelectInput 函数包装在 observeEvent 中,它们只会在必要的输入实际更新时尝试运行,如下所示:

library(shiny)

runApp(list(

  ui = bootstrapPage(
    selectInput('dataset', 'Choose data set', c('mtcars', 'iris')),
    selectInput('columns', 'Choose variable', ""),
    selectInput('values', 'Show values', "")
  ),

  server = function(input, output, session)

    # updates variable names based on selected dataset 
    outVar = reactive(
      names(get(input$dataset))
    )

    # i want this to update the values of the selected variable
    outVar2 = reactive(
      if (input$columns == "") return()
      sort(unique(get(input$dataset)[, input$columns]))
    )

    # create separate observeEvents to 
    observeEvent(input$dataset, 
      updateSelectInput(session, "columns", choices = outVar())
    )

    observeEvent(input$columns, 
      updateSelectInput(session, "values", choices = outVar2())
    )

  
))

【讨论】:

以上是关于R Shiny:将多个连续的反应传递给 selectInput的主要内容,如果未能解决你的问题,请参考以下文章

通过 Shiny Server 将 Shiny 输入传递给 R markdown

R Shiny:如何在嵌套模块之间传递反应变量

R Shiny:如何使多个元素在添加/删除按钮上下文中具有反应性?

如何在 Shiny 中引用 ui.R 中的反应元素

闪亮的应用程序创建 - 将结果传递给表;不允许从 Shiny 读取对象

R-Shiny:在文件输入上选择输入反应