闪亮模块:如何访问循环闪亮模块的输入 $?

Shiny Modules: how to access the input$ of a looped Shiny Module?

我正在思考 Shiny Module 嵌套问题,遇到了这个问题。

带有 issue is available here. 复制粘贴到 .R 文件和 RStudio 中 运行 的示例 Shiny 应用程序的代码应该复制它。

我正在尝试制作一个可以 filter/aggregate 任何 data.frame 的辅助函数。我得到了一些已经有用的动态 SelectInputs,但我现在想将这些 SelectInputs 放入一个循环中,这样我就可以子集 data.frame.

问题似乎是在 Shiny 服务器循环中生成的输入无法通过正常的 Shiny 模块方式访问,而且我无法找到查找它们名称的语法。问题出在这些行中:

  new_data <- reactive({
    old_data <- the_data()
    for(i in seq_along(aggs)){

      str(i) ## debug to check its in loop

      agg <- aggs[i]

      ## How to access the dynamic_select inputs selected?
      inputA <- input[[agg]]  # is NULL?
      old_col <- old_data[[agg]] 

      str(inputA) ## debug - NULL should hold values of dynamic inputs

      new_data <- old_data[inputA %in% old_col,]

      old_data <- new_data

    }

    new_data

  })

有没有人知道如何访问应该出现在变量 inputA 中的选定值?

这感觉相当 "hacky",但如果您将 new_data 反应更改为

  new_data <- reactive({
    old_data <- the_data()
    for(i in seq_along(aggs)){
      str(i) ## debug to check its in loop
      agg <- aggs[i]
      inputA <- input[[paste0(aggs[i], '-dynamic_select')]]
      old_col <- old_data[[agg]]
      new_data <- old_data[inputA %in% old_col,]
      old_data <- new_data
    }
    new_data
  })

然后你应该得到一个输出。

这里似乎发生的是你的动态输入元素已经通过 ns() 磨两次(而且必然如此),所以网页上的元素被称为 "debug_dynamic-mpg-dynamic_select" 和 "debug_dynamic-gear-dynamic_select" 通过在 new_data 反应式中对“-dynamic_select”进行硬编码,您将使其工作。但代价是,如果您在 dynamicSelectUI 中更改 "dynamic-select",您还需要记住在 new_data 函数中更改它。代码不是 DRY,但是可以用某个地方的一些变量来修复。我会把这个头疼的事情留给你。

干杯 你在爱丁堡的朋友

Joe 在 Shiny Google 小组中提供帮助,Gist 现在有一个工作版本: https://gist.github.com/MarkEdmondson1234/7565787bb020b1c7cb691cf80e816d68

这是他的回答:

模块的一般规则是您只能在相应的模块服务器函数中访问模块 UI 输入的值。在这种情况下,您只能从 dynamicSelect 中访问 dynamicSelectInput 的值。如果你想让这个值对其他模块可用,那么你必须 return 它作为模块服务器功能的反应。在这种情况下,这意味着 dynamicSelect 函数应该以这一行结尾:

  return(reactive(input$dynamic_select))

("return" 是可选的,但我认为它有助于明确说明 reactive(input$dynamic_select) 是 return 值这一事实。)

然后,在 outerTable 中,你可以做这样的事情而不是你的 for 循环:

  selectResults <- lapply(setNames(aggs, aggs), function(agg) {
    callModule(module = dynamicSelect,
      id = agg,
      the_data = the_data,
      column = agg)
  })

现在 selectResults 是一个命名列表,每个元素都是一个反应式表达式(因此 selectResults[[agg]]() 检索一个值)。