【问题标题】:Shiny Modules: how to access the input$ of a looped Shiny Module?Shiny Modules:如何访问循环 Shiny Module 的 input$?
【发布时间】:2016-08-18 21:32:21
【问题描述】:

我正在考虑 Shiny Module 嵌套并且遇到了这个问题。

issue is available here. 复制粘贴到 .R 文件并在 RStudio 中运行的 Shiny 应用示例的代码应该会复制它。

我正在尝试创建一个辅助函数来过滤/聚合任何 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 中的选定值?

【问题讨论】:

    标签: r module shiny-server shiny


    【解决方案1】:

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

    这是他的回答:

    模块的一般规则是您只能在相应的模块服务器函数中访问模块UI 的输入值。在这种情况下,您只能从dynamicSelect 中访问dynamicSelectInput 的值。如果您想将该值提供给其他模块,那么您必须将其作为模块服务器函数的响应返回。在这种情况下,这意味着dynamicSelect 函数应该以这一行结束:

      return(reactive(input$dynamic_select))
    

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

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

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

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

    【讨论】:

      【解决方案2】:

      这感觉很“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 中更改“动态选择”,您还需要记住在您的 new_data 函数中更改它。代码不是 DRY,但可以通过某个变量来修复。我会把这个头痛留给你。

      干杯 你在爱丁堡的朋友

      【讨论】:

        猜你喜欢
        • 2018-03-15
        • 1970-01-01
        • 2015-05-28
        • 2017-04-29
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 2022-12-19
        • 2022-11-21
        相关资源
        最近更新 更多