需要触摸server.R才能执行

时间:2014-08-17 15:08:51

标签: r shiny shiny-server

My Shiny应用程序应该读取目录并捕获所有rds文件。它运行正常。但是当一个新的rds文件进入app想要读取的目录时,它无法读取新文件。当我触摸server.R然后应用程序也能够捕获新文件。

简而言之,无论何时新文件进入目录,我都需要触摸server.R文件作为最新内容。我没有对server.R进行任何更改。要成功执行,我需要运行“touch server.R”。有人见过这个吗?

我无法理解,server.R需要时间戳的任何更改才能成功运行。

谢谢! Tinku

@ MrFlick - 不,我没有在server.R文件中硬编码。实际上相同的代码正在其他服务器上运行。我只是将相同的程序从test复制到qa框而不是改变了行为。如果我触摸server.R文件并刷新浏览器,那么它工作正常。对我来说很奇怪!

@jdharrison - 感谢您的建议。但是这个(我现有的server.R)代码在开发服务器上运行正常但是当我转移到QA时,它没有按预期运行。我很惊讶,server.R中的触摸或任何非重大变化使其能够正常运行一次。

实际上,server.R代码正在从目录中读取.RDS文件并显示在下拉列表中。它在开发服务器上工作正常。但是在QA服务器上,如果我正在删除或创建任何新的.RDS文件,那么它不会自动显示在下拉列表中,直到我触摸server.R文件。

1 个答案:

答案 0 :(得分:2)

您可以使用reactivePoll定期检查您感兴趣的目录。在此示例中,actionButton允许用户将文件添加到测试目录。应用程序每秒轮询测试目录,并显示带有文件信息的表:

library(shiny)
dir.create('test', showWarnings = FALSE)
write(1:3, 'test/dumfile.txt')
write(1:3, 'test/dumfile2.txt')
readTimestamp <- function() Sys.time()
valueFunc <- function() {
  print(readTimestamp())
  out <- lapply(list.files('test', full.names = TRUE), file.info)
  do.call(rbind.data.frame, out)
}
runApp(list(
  ui = bootstrapPage(
    actionButton("addFile", "Add a file!"),
    tableOutput('myTable')
  ),
  server = function(input, output, session) {
    observe({
      if(input$addFile > 0){
        write(1:3, tempfile('file', 'test', '.txt'))
      }
    })
    dirData <- reactivePoll(1000, session, readTimestamp, valueFunc)
    output$myTable <- renderTable({
      myData <- dirData()
      myData
    })
  }
))

enter image description here