У меня нет большого опыта работы с блестящими развертываниями на shinyapps.io, но я постараюсь сделать это как можно более общим. Основное ограничение заключается в невозможности запланировать задание CRON для получения данных с вашего компьютера по расписанию. , Поэтому я хотел бы рассмотреть следующее:
- Pu sh ваши данные в провайдере хранения (в качестве примера будет использоваться Dropbox) каждые 5 минут с использованием задания CRON
- Захватите данные в вашей Shiny Dashboard.
Ниже вы можете найти пример пары для Dropbox и Google Drive, но вы можете легко применить почти те же понятия для AWS и GCP (хотя вам придется возиться с передачей секретов или шифрованием ваших токенов аутентификации.
Пример Dropbox
rdrop2
предлагает простую в использовании оболочку для Dropbox API. Ниже вы можете найти простой пример того, как создать sh и получить текстовый файл из учетной записи (из rdrop2
readme).
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
, но использование crontab
на Linux будет работать нормально.
library(cronR)
cron_add(source("data_upload.R"), frequency = "*/5 * * * *",
description = "Push data to Dropbox")
plumber
api
Как упомянул @Chris, вызов API мог бы быть вариантом, особенно если данные потребуются вне R-скриптов и Shiny dashboards. Ниже вы можете найти короткую конечную точку, которую можно вызвать для извлечения данных в формате 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()