在shinyapps.io上实现源文件自动重新读取的可行性咨询
首先得说清楚为什么你本地能用reactiveFileReader但部署到shinyapps.io不行——因为shinyapps.io的应用文件系统是只读且静态的。你部署时上传的CSV文件会被固定在应用的目录里,之后你本地更新了CSV,shinyapps.io上的副本不会自动同步,自然不会触发reactiveFileReader的更新检测。
不过别担心,有几种可行的方法能实现你要的定期更新功能:
方法1:将CSV放到远程存储,让应用定期读取
把你的CSV文件放到一个公共可访问的远程位置(比如Google Drive、Dropbox、AWS S3等),然后用reactiveTimer配合读取远程文件,替代本地的reactiveFileReader。
举个简单的例子,假设你的CSV有公开的直接下载链接:
library(shiny) ui <- fluidPage( tableOutput("updated_data") ) server <- function(input, output, session) { # 设置定时器,每24小时触发一次更新(单位是毫秒) daily_update <- reactiveTimer(24 * 60 * 60 * 1000) # 响应式读取远程CSV latest_data <- reactive({ daily_update() # 触发定期更新 # 替换成你的CSV公开下载链接 read.csv("https://your-public-csv-url-here.csv") }) output$updated_data <- renderTable({ latest_data() }) } shinyApp(ui, server)
如果用私有存储(比如S3),可以用对应的R包(如aws.s3)读取,记得在shinyapps.io的应用设置里配置好存储服务的凭证(比如环境变量)。
方法2:用shinyapps.io的计划任务定期重新部署
如果你的CSV还是存在本地项目目录,你可以把代码和CSV放到GitHub仓库,然后在shinyapps.io里连接这个仓库,设置计划任务(Scheduled Tasks)定期自动部署应用。这样每天部署时,最新的CSV会被同步到shinyapps.io,应用自然就能拿到新数据。
操作步骤大概是:
- 把你的Shiny项目推送到GitHub仓库
- 在shinyapps.io里关联这个仓库
- 进入应用的「Settings」→「Scheduled Tasks」,添加一个每天执行一次的部署任务
这种方式适合不想改动代码的情况,但缺点是每次部署会短暂重启应用。
方法3:从API直接拉取数据(如果适用)
如果你的源数据本身是从某个API获取的,那直接让应用定期调用API获取最新数据就行,完全不用依赖本地CSV文件,这也是最灵活的方式。
总结一下,reactiveFileReader在shinyapps.io上没法直接用在本地项目的CSV上,因为文件系统是静态的,但上面几种方法都能帮你实现定期更新的需求。
内容的提问来源于stack exchange,提问作者Martin

