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文件。
答案 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
})
}
))