использование purrr :: walk для создания нескольких наблюдателей событий - PullRequest
0 голосов
/ 28 мая 2018

У меня есть группа переменных, которые используются в качестве идентификаторов для html-элементов с соответствующими функциями (удобно называются 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)
}

Но это не сработало.Есть идеи?

1 Ответ

0 голосов
/ 28 мая 2018

Ваша проблема начинается здесь.Чистая оценка не является оптимальным способом решения этой проблемы.

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

Вы хотите (верно?) Получить input$foo1 и foo1.helper.С вашим кодом конечный результат - это кластер из quo s, sym s и восклицательных знаков.

Прежде всего, если все ваши вспомогательные переменные выполняют одно и то же, почему вы создаете многоотдельных переменных, называемых 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...