假设我有以下Shiny应用程序(最低限度可重复的示例):
global.R
# Clear environments
rm(foo.insert)
rm(.test)
if (!exists('.test')) .test <- new.env()
library(shiny)
## Setup
set.seed(1234)
.test$foo <- data.frame(replicate(10,sample(0:100,5,rep=TRUE))) # nrow(.test$foo) returns 5
foo.insert <- function(x) {
newRow <- sample(0:100,5,rep=TRUE)
newDf <- rbind(x, newRow)
assign(x = 'foo', value = newDf, envir = .test) # Add 1 row and reassign .test environment
cat(paste0(Sys.time(), ' Foo now has ', nrow(newDf), ' rows.\n'))
} # foo.insert(.test$foo)
ui.R
:
shinyUI(navbarPage(title = "TestApp",
tabPanel("Home",
withTags({
div(class="container", checked=NA,
div(class="jumbotron", checked=NA,
h4("Testing123"),
tableOutput("downloadTable")))
}),
icon = NULL),
footer = NULL
))
server.R
:
shinyServer(function(input, output, session) {
## Set up observers
updateFoo <- observe({
invalidateLater(30*1000, session = NULL) # Update every 30 seconds
foo.insert(.test$foo)
}, priority = 1)
## Reactively get the table data (to pass into the render function) every x seconds
tableData <-reactivePoll(30*1000, session = NULL,
checkFunc = function() {Sys.time()},
valueFunc = function() {
get('foo', .test)
})
output$downloadTable <- renderTable({
tableData()
}, width = '100%')
})
问题在于:
负载似乎在运行。我在我的服务器定义中的foo.insert()
内调用observe
函数,该函数在某个时间间隔内获取基础数据(此处,我将其设置为30秒)。因为我在定义中添加了cat
输出,所以我可以在RStudio的控制台中确认它确实每隔30秒运行一次。
当我在网络浏览器中打开应用程序时(RStudio&gt;运行应用程序&gt;在浏览器中打开),我注意到这样做会重新运行foo.insert()
中的observe
功能,就像应用程序刚刚推出。 当我执行页面刷新(F5)时也会发生这种情况 - 并且在我的函数Sys.time()
控制台输出中由cat
确认。换句话说,每当我按下F5时,无论观察者如何,它都会执行该功能。
显然这对我的应用来说是不可取的(无论用户做什么,该功能都应该每30秒运行一次服务器端)。我该如何解决这个问题?