使用Purrr::Walk安装多个事件观察器 [英] using purrr::walk to instate multiple event observers

查看:10
本文介绍了使用Purrr::Walk安装多个事件观察器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组变量,它们用作具有匹配函数的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)
}

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

推荐答案

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

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

您想要(对吗?)获取input$foo1foo1.helper。使用您的代码,最终结果是这组quosym和感叹号。

首先,如果您的所有辅助变量都在做相同的事情,为什么要创建许多单独的变量,称为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循环与SHINY内部注册观察器等的特定方式不能很好地配合使用。

因此您的代码将变为:

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)

这篇关于使用Purrr::Walk安装多个事件观察器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆