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

时间:2016-04-25 13:05:34

标签: r module shiny-server shiny

我把头包裹在Shiny Module嵌套周围并遇到这个问题。

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

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

2 个答案:

答案 0 :(得分:2)

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

以下是他的回答:

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

  return(reactive(input$dynamic_select))

(&#34; return&#34;是可选的,但我认为它有助于明确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]]()检索一个值)。

答案 1 :(得分:0)

这感觉非常“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,但可以用某个变量修复。我会把这个头痛留给你。

干杯 你在爱丁堡的朋友