Ваша проблема начинается здесь.Чистая оценка не является оптимальным способом решения этой проблемы.
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)