R,输入向量的字符串向量

时间:2017-03-21 23:06:00

标签: r shiny

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(),但似乎没有用。有什么建议?

1 个答案:

答案 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()
        })
      })
    }
  }
)