【问题标题】:using purrr::walk to instate multiple event observers使用 purrr::walk 设置多个事件观察者
【发布时间】:2018-11-06 22:40:31
【问题描述】:

我有一组变量用作 html 元素上的 id,具有匹配的函数(方便地命名为 varname.helper()),每当在相应的 html 元素上触发事件时,我希望调用它们。

我尝试了以下方法:

server <- function(input, output, session) {
    observables <- c("foo1", "foo2", "foo3") # they are obviously much more than 3 vars...
    observables %>% walk(function(x) {
        observeEvent(quo(!!sym(paste0("input$", x))), quo(!!sym(paste0(x, ".helper"))(input)), handler.quoted=TRUE)
}

但它没有用。有什么想法吗?

【问题讨论】:

标签: r shiny purrr


【解决方案1】:

您的问题从这里开始。整洁的评估并不是解决这个问题的最佳方法。

    observeEvent(quo(!!sym(paste0("input$", x))), 
          quo(!!sym(paste0(x, ".helper"))(input)), handler.quoted=TRUE)

您希望(对吗?)获得input$foo1foo1.helper。使用您的代码,最终结果是quos、syms 和感叹号的集群。

首先,如果你所有的辅助变量都做同样的事情,你为什么要创建很多单独的变量foo1.helper?将它们放在一个列表中会更有意义,因此您可以使用任何类型的循环/映射来让您的生活更轻松:

helpers <- list(foo1 = whatever..., foo2 = whatever...)

接下来,

quo(!!sym(paste0("input$", x)))

为您提供具有特定用例的相当复杂的对象。与其使用$,不如使用双括号选择:

input[[x]]

这使您可以使用字符变量x 根据名称从列表中选择一个项目。这些更容易使用。 $ 语法只是糖,不允许您轻松使用字符值。

总结一下:

observeEvent(input[[x]], quote(helpers[[x]](input)), handler.quoted = TRUE)

这里有一个简短的示例,说明如何在您的代码中加入这些内容。请注意,您必须在此处使用purrr::walk,因为您不能使用for 循环。 for 循环与闪亮内部注册观察者等的特定方式不能很好地协同工作。

所以你的代码会变成:

library(shiny)
library(purrr)

ui <- fluidPage(
   sidebarLayout(
      sidebarPanel(
         actionButton("foo1", "Foo 1"),
         actionButton("foo2", "Foo 2")
      ),
      "Nothing here"
   )
)

server <- function(input, output) {
  helpers <- list(foo1 = quote(cat("foo 1; ")), foo2 = quote(cat("foo 2; ")))
  purrr::walk(c("foo1", "foo2"), ~ observeEvent(input[[.x]], 
        helpers[[.x]], handler.quoted = TRUE))
}

shinyApp(ui = ui, server = server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多