我把头包裹在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中的选定值?
答案 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,但可以用某个变量修复。我会把这个头痛留给你。
干杯 你在爱丁堡的朋友