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()