避免浏览器刷新闪亮触发observe()重启

时间:2017-05-02 02:24:11

标签: r shiny shiny-server shinydashboard

假设我有以下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秒运行一次服务器端)。我该如何解决这个问题?

0 个答案:

没有答案