TL; DR:
我有这个矢量/字符列表,它可能看起来像这样:
list_of_inputs <- c('input$thing_1', 'input$thing_2', ...)
或者像这样:
list_of_inputs <- c('thing_1', 'thing_2', ...)
我需要的是将其转换为如此解释:
c(input$thing_1, input$thing_2, ...)
这可能吗?
原因是我想以编程方式创建闪亮的输入,并以编程方式检查其中一个是否被击中。如果我在ui.R / ui-function中手动声明输入,则可以:
observeEvent(c(input$manually_made_1, input$manually_made_2), {
print('a button has been hit!')
}
这也有效:
observeEvent(c(input[['manually_made_1']], input[['manually_made_2']]), {
print('a button has been hit!')
}
我不能只将observe_vent_inputs作为一个向量/字符串/字符列表给observeEvent,因为它不明白。但是,如果我尝试使用循环创建列表:
input_list <- c()
for(i in 1:length(list_of_inputs){
input_list <- append(input_list, input[[paste0('thing_',i)]])
}
input_list最终只包含NULL(或几个)...... 我尝试使用as.symbol(),但似乎没有用。有什么建议?
答案 0 :(得分:0)
以下是供您考虑的替代解决方案。下面的Shiny应用程序列出了按钮信息列表(id,label和callback),并为每个项目添加了actionButton
和观察者。按下每个按钮将从列表中触发相应的回调功能。
拨打local()
是关键。如果删除对local
的调用,则只将for循环的最终表达式注册为观察者。 local
解决方法的信用额转到此主题https://gist.github.com/wch/5436415/和Winston Chang。
如果多个按钮需要共享回调,您可以在列表外定义该功能并多次引用它。如果不需要多个回调,您可以放弃,包括列表中的回调元素,并构建observeEvent
的事件表达式。
library(shiny)
myButtons <- list(
list(
id = "first",
label = "First Button",
callback = function() {
print("The first button was pushed??")
}
),
list(
id = "second",
label = "Second Button",
callback = function() {
print("And now the second button was pushed")
}
)
)
shinyApp(
ui = fluidPage(
lapply(
myButtons,
function(btn) actionButton(btn$id, btn$label)
)
),
server = function(input, output, session) {
for (btn in myButtons) {
local({
btnLocal <- btn
observeEvent(input[[btnLocal$id]], {
btnLocal$callback()
})
})
}
}
)