tl; dr: Попробуйте поместить функцию order()
, которая вызывает poolData()
внутри функции observe()
Я полагаю, что проблема связана стот факт, что reactivePoll
, в отличие от того, как он работает, должен быть вызван внутри реактивной среды, чтобы нормально функционировать.
Когда я запускаю приведенную ниже программу, у меня возникает та же проблема, что и у вас:
library(shiny)
ui <- fluidPage(
mainPanel(
verbatimTextOutput('text')
)
)
server <- function(input, output, session) {
pollData <- reactivePoll(600,session,
checkFunc = function() {
print("Entered Check")
Sys.time()
print(Sys.time())
},
valueFunc = function() {
print("entered value")
return('x')
}
)
ord <- function(data) {
print(data)
}
ord(isolate(pollData())) # 1: Only triggers once
# observe(ord(pollData())) # 2: Triggers every time
}
shinyApp(ui = ui, server = server)
[1] "Entered Check"
[1] "2018-12-20 09:39:35 PST"
[1] "entered value"
[1] "x"
[1] "Entered Check"
[1] "2018-12-20 09:39:35 PST"
[1] "Entered Check"
[1] "2018-12-20 09:39:36 PST"
...
Но если я использую окружение, использую Second Way выше (оборачивая вызов ord
в функцию observe
), тогда он работает как положено:
[1] "Entered Check"
[1] "2018-12-20 09:41:50 PST"
[1] "Entered Check"
[1] "2018-12-20 09:41:50 PST"
[1] "entered value"
[1] "x"
[1] "Entered Check"
[1] "2018-12-20 09:41:50 PST"
[1] "entered value"
[1] "x"
Я предполагаю, что происходит то, что reactivePoll
работает как любое другое выражение reactive*
: когда оно вызывается, оно проверяет, является ли оно недействительным.Если это не так, он возвращает сохраненное значение;если это так, то он запускается снова и возвращает обновленное значение.
Я думаю, что происходит, когда checkFunc
обнаруживает изменение, он не сообщает valueFunc
, что он запускается напрямую, онпросто лишает законной силы reactive*
.Как только он признан недействительным, valueFunc
запускается при вызовеЕсли вы никогда не называете это (поскольку вас интересуют только побочные эффекты), то valueFunc
не запускается.
В вашем случае, я думаю (по любой причине) реактивная среда создалаshinydashboard
функционирует подобно первому варианту: достаточно как реактивная среда, чтобы получить доступ к значению функции reactivePoll
, но она не вызывает valueFunc
.Окружив функцию order
функцией observe*
, вы будете продолжать проверять и вызывать функцию.