Shinyapp.io 读取每 5 分钟更新一次内容的本地文件
Shinyapp.io to read a local file that update its content every 5 minutes
我的 shiny 应用每 5 分钟就会从我桌面上的本地文件中读取内容,因为该文件的内容也每 5 分钟更新一次。我闪亮的应用程序基本上读取新内容并将数据附加到现有数据框,并每 5 分钟绘制一次新内容。
问题: 最后,我想在线托管这个。如果我在 shinyapps.io
上托管它,我是否仍然能够在我的桌面上读取每 5 分钟更新一次的本地文件?如果没有,我该怎么办?
我在 shinyapps.io 上没有丰富的闪亮部署经验
但我会尽量保持一般性,因为 possible.The 主要限制在于无法安排 CRON 作业从您的
机器按计划。因此,我会考虑以下几点:
- 使用 CRON 作业每 5 分钟将您的数据推送到存储提供商(以 Dropbox 为例)
- 在闪亮的仪表板中获取数据。
下面您可以找到有关 Dropbox 和 Google Drive 的几个示例,但您可以轻松地将几乎相同的概念应用于 AWS 和 GCP(尽管您必须 fiddle 传递秘密或加密您的身份验证令牌)。
Dropbox 示例
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")
在 Shiny 中实现它
在 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!")
您的 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)
部署到 shinyapps
然后您可以像往常一样部署您的应用程序(包括授权令牌)。
正在安排数据上传
由于您的数据在本地计算机上每 5 分钟刷新一次,因此需要它
有一个具有该节奏的上传时间表。在这里我将使用 cronR
包但是
在 Linux 上使用 crontab
就可以了。
library(cronR)
cron_add(source("data_upload.R"), frequency = "*/5 * * * *",
description = "Push data to Dropbox")
plumber
api
正如@Chris 提到的,调用 API 可能是一种选择,尤其是在 R 脚本和 Shiny 仪表板之外需要数据的情况下。您可以在下面找到一个短端点,可以调用它来检索 csv 格式的数据。 Shinyapps.io 不支持托管 plumber
api,因此您必须将其托管在您最喜欢的云提供商上。
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')
}
构建并启动服务:
r <- plumb("plumber.R")
r$run()
我的 shiny 应用每 5 分钟就会从我桌面上的本地文件中读取内容,因为该文件的内容也每 5 分钟更新一次。我闪亮的应用程序基本上读取新内容并将数据附加到现有数据框,并每 5 分钟绘制一次新内容。
问题: 最后,我想在线托管这个。如果我在 shinyapps.io
上托管它,我是否仍然能够在我的桌面上读取每 5 分钟更新一次的本地文件?如果没有,我该怎么办?
我在 shinyapps.io 上没有丰富的闪亮部署经验 但我会尽量保持一般性,因为 possible.The 主要限制在于无法安排 CRON 作业从您的 机器按计划。因此,我会考虑以下几点:
- 使用 CRON 作业每 5 分钟将您的数据推送到存储提供商(以 Dropbox 为例)
- 在闪亮的仪表板中获取数据。
下面您可以找到有关 Dropbox 和 Google Drive 的几个示例,但您可以轻松地将几乎相同的概念应用于 AWS 和 GCP(尽管您必须 fiddle 传递秘密或加密您的身份验证令牌)。
Dropbox 示例
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")
在 Shiny 中实现它
在 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!")
您的 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)
部署到 shinyapps
然后您可以像往常一样部署您的应用程序(包括授权令牌)。
正在安排数据上传
由于您的数据在本地计算机上每 5 分钟刷新一次,因此需要它
有一个具有该节奏的上传时间表。在这里我将使用 cronR
包但是
在 Linux 上使用 crontab
就可以了。
library(cronR)
cron_add(source("data_upload.R"), frequency = "*/5 * * * *",
description = "Push data to Dropbox")
plumber
api
正如@Chris 提到的,调用 API 可能是一种选择,尤其是在 R 脚本和 Shiny 仪表板之外需要数据的情况下。您可以在下面找到一个短端点,可以调用它来检索 csv 格式的数据。 Shinyapps.io 不支持托管 plumber
api,因此您必须将其托管在您最喜欢的云提供商上。
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')
}
构建并启动服务:
r <- plumb("plumber.R")
r$run()