Постоянно читать json файл - PullRequest
2 голосов
/ 10 февраля 2020

Я хочу читать файл json непрерывно, например, каждые 1000 мс.

  1. Один из вариантов - be betivetiveFileReader

reactiveFileReader(intervalMillis, session, filePath, readFunc, ...)

описано здесь . Эта функция работает только с файлами CSV, а не с файлами json:

file_data <- reactiveFileReader(intervalMillis = 1000, NULL, filePath = json_path, readFunc = read.json)

  observe({
    View(file_data())
  })

Error in View : object read.json not found
С реактивнымПолл, как здесь:
getJsonData <- reactivePoll(1000, session,
                                  checkFunc = function() {
                                      if (file.exists(path))
                                          file.info(path)$mtime[1]
                                      else
                                          ""
                                   },
                                   valueFunc = function() {
                                       read_json(path)
                                   }

Я получаю почти то, что хочу, но эта функция не работает в моем контексте. Как заставить программу читать файл каждую секунду, а не только при изменении содержимого файла?

Есть ли другие возможности, о которых я еще не думал?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

По-вашему, вы написали read.json вместо read_json.

Вторым способом вы можете заменить file.info(path)$mtime[1] на runif(1, 0, 1e6). Вам бы очень не повезло, если runif вернет одно и то же число два раза подряд.

Наконец, третий путь может быть:

server <- function(input, output, session){

  autoInvalidate <- reactiveTimer(1000)

  getJsonData <- reactive({
    autoInvalidate()
    read_json("path/to/file.json")
  })

}
1 голос
/ 10 февраля 2020

Вот пример того, как использовать reactiveFileReader с файлом json.

Я использовал future, чтобы отделить процесс записи от блестящего сеанса - вы можете просто заменить его своим json вход.

library(shiny)
library(jsonlite)
library(datasets)
library(promises)
library(future)

plan(multisession(workers = 2))

ui <- fluidPage(
  uiOutput("printResult")
)

server <- function(input, output, session) {

  json_path <- tempfile(fileext = ".json")
  write_json(NULL, json_path)

  # async file writing process
  future({
    for(i in seq_len(nrow(iris))){
      Sys.sleep(1)
      write_json(iris[i,], json_path)
    }
  })

  file_data <- reactiveFileReader(intervalMillis = 1000, NULL, filePath = json_path, readFunc = read_json)

  output$printResult <- renderUI({
    req(file_data())
  })

}

shinyApp(ui, server)

Result

...