Shinyapp.io для чтения локального файла, который обновляет его содержимое каждые 5 минут - PullRequest
0 голосов
/ 28 марта 2020

Мое блестящее приложение будет считывать содержимое из локального файла на моем рабочем столе каждые 5 минут, потому что содержимое файла также обновляется каждые 5 минут. И мое блестящее приложение в основном считывает новый контент и добавляет данные к существующему фрейму данных и выводит новый контент каждые 5 минут.

Вопрос : В конечном счете, я хотел бы разместить у себя это онлайн. Если я размещу это на shinyapps.io, смогу ли я читать локальный файл на рабочем столе, который обновляется каждые 5 минут? Если нет, что я могу сделать?

1 Ответ

3 голосов
/ 29 марта 2020

У меня нет большого опыта работы с блестящими развертываниями на 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

Затем вы можете развернуть свое приложение как обычно (включая токен аутентификации). enter image description here

Планирование загрузки данных

Поскольку ваши данные обновляются каждые 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()
...