闪亮模块:如何访问循环闪亮模块的输入 $?
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]]()
检索一个值)。
我正在思考 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]]()
检索一个值)。