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 的代码,该输入列出了在第二个输入中选择的变量的值。此示例基于 mtcars
和 iris
数据集,并在 R v 3.1.1 和 RStudio v 0.98.1062 上运行。它不会引发错误,但您会发现我一直在纠结如何添加第二个 reactive()
,它的输入是 input$dataset
和 input$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
语句将在任一变量更新时运行。因此,当更改第二个selectInput
(input$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:如何使多个元素在添加/删除按钮上下文中具有反应性?