Предложенное вами решение не является правильным в блестящем, я настоятельно рекомендую не делать этого.Не используйте <<-
для назначения, это почти никогда не правильно делать в блестящем, это может «казаться» правильным, но имеет непреднамеренное поведение, которое может привести к странным ошибкам.Обычно, когда вы хотите использовать <<-
, правильнее всего использовать reactiveVal()
.
. Рассмотрим приложение ниже, которое использует <<-
для сохранения промежуточной суммы числа (я используюпример приложения, отличный от вашего, чтобы его было проще и легче понять):
ui <- fluidPage(
actionButton("add1", "Add 1"),
actionButton("add5", "Add 5")
)
server <- function(input, output) {
mysum <<- 0
observeEvent(input$add1, {
mysum <<- mysum + 1
print(mysum)
})
observeEvent(input$add5, {
mysum <<- mysum + 5
print(mysum)
})
}
shinyApp(ui, server)
Приведенное выше приложение будет работать нормально, когда вы его тестируете, но когда вы производите его в реальном мире, вы заметитеошибка: если вы откроете две вкладки браузера, переменная будет разделена между двумя.На самом деле, число будет общим для всех пользователей.Этого не произойдет в вашем приложении, потому что ваше первоначальное назначение использовало <-
, а второе - <<-
, но приведенный выше шаблон я часто вижу, поэтому я хотел явно показать его.Другая вещь, которая здесь не так, заключается в том, что теперь вы покинули мир реактивности - mysum
не является реактивной переменной, поэтому мы не можем использовать ее в любом реактивном контексте в блестящем (вот почему ваш нерешительный № 2не работал).Ниже представлен лучший подход:
ui <- fluidPage(
actionButton("add1", "Add 1"),
actionButton("add5", "Add 5")
)
server <- function(input, output) {
mysum <- reactiveVal(0)
observeEvent(input$add1, {
mysum(mysum() + 1)
})
observeEvent(input$add5, {
mysum(mysum() + 5)
})
observe({
print(mysum())
})
}
shinyApp(ui, server)
Вы можете прочитать этот ответ для более подробного обсуждения