我闪亮的应用程序将每 5 分钟从我桌面上的本地文件读取内容,因为文件的内容也每 5 分钟更新一次。我闪亮的应用程序基本上读入了新内容并将数据附加到现有数据框中,并每 5 分钟绘制一次新内容。
问题:最终,我想在网上主持这个。如果我将它托管在 上shinyapps.io,我是否仍然能够读取我桌面中每 5 分钟更新一次的本地文件?如果没有,我该怎么办?
我没有在 Shinyapps.io 上进行闪亮部署的丰富经验,但我会尽量保持一般性。主要限制在于无法安排 CRON 作业按计划从您的机器上获取数据。因此,我会考虑以下几点:
您可以在下面找到有关 Dropbox 和 Google Drive 的几个示例,但您可以轻松地将几乎相同的概念应用于 AWS 和 GCP(尽管您必须处理传递机密或加密您的身份验证令牌)。
rdrop2为 Dropbox API 提供一个易于使用的包装器。您可以在下面找到一个关于如何从帐户(从rdrop2自述文件)推送和检索文本文件的简单示例。
library(rdrop2)
# Authenticate and save token for later use2
token <- drop_auth()
saveRDS(token, "~/dropbox_token.rds")
# Create a folder
drop_create('upload_test')
# You can also create a public folder if data is not sensitive
# drop_create('public/upload_test')
# Upload the file in the freshly created folder
drop_upload("~/mtcars.csv", path = "upload_test")
## Retrieveing your file is as simple as
drop_download("upload_test/mtcars.csv", local_path = "~/new_file.csv")
Run Code Online (Sandbox Code Playgroud)
在 Shiny 中应用上述示例的最简洁方法是将数据采集放在一个global.R文件中,该文件将在运行之前导入到您的 Shiny 应用程序中
global.R::
library(rdrop2)
# Authenticate and save token for later use2
token <- drop_auth(rdstoken = "dropbox_token.rds")
# Retrieveing your file is as simple as
drop_download("upload_test/mtcars.csv", local_path = "data.csv",
overwrite = TRUE)
drop_df <- read.csv("data.csv", sep = ",")
print("Downloaded and imported data!")
Run Code Online (Sandbox Code Playgroud)
您的app.R文件将如下所示:
library(shiny)
source("global.R")
ui <- fluidPage(
# Application title
titlePanel("Pulling data from Dropbox"),
mainPanel(
tableOutput("df_output")
)
)
server <- function(input, output) {
output$df_output <- renderTable({
drop_df
})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
由于您的数据在本地机器上每 5 分钟刷新一次,因此需要有一个具有该节奏的上传计划。在这里,我将使用该cronR软件包,但crontab在 Linux 上使用会很好。
library(cronR)
cron_add(source("data_upload.R"), frequency = "*/5 * * * *",
description = "Push data to Dropbox")
Run Code Online (Sandbox Code Playgroud)
plumber 接口正如@Chris 提到的,调用 API 可能是一种选择,尤其是在 R 脚本和 Shiny 仪表板之外需要数据时。您可以在下面找到一个可以调用以检索 csv 格式数据的短端点。Shinyapps.io 不支持托管plumberapi,因此您必须将其托管在您最喜欢的云提供商上。
library(plumber)
library(rdrop2)
#* @apiTitle Plumber Example API
#* Echo dropbox .csv file
#* @get /get-data
function(req, res) {
auth_token <- drop_auth(rdstoken = "token.rds")
drop_download('upload_test/mtcars.csv', dtoken = auth_token,
local_path = "mtcars.csv", overwrite = TRUE)
include_file("mtcars.csv", res, 'text/csv')
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令构建和启动服务:
r <- plumb("plumber.R")
r$run()
Run Code Online (Sandbox Code Playgroud)