Загрузка данных XLSX с помощью RestRserve - PullRequest
1 голос
/ 13 апреля 2020

Я бы хотел работать с RestRServe, чтобы файл .xlsx был загружен для обработки. Я пробовал ниже с использованием .csv с успехом, но некоторые небольшие изменения для .xlsx с get_file не были плодотворными.

ps <- r_bg(function(){

  library(RestRserve)
  library(readr)
  library(xlsx)

  app = Application$new(content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  app$add_post(
    path = "/echo",
    FUN = function(request, response) {
      cnt <- request$get_file("xls")
      dt <- xlsx::read.xlsx(cnt, sheetIndex = 1, header = TRUE)
      response$set_body("some function")
    }
  )

  backend = BackendRserve$new()
  backend$start(app, http_port = 65080)
})

1 Ответ

2 голосов
/ 14 апреля 2020

Что вы пробовали? Согласно документации request$get_file() метод возвращает необработанный вектор - двоичное представление файла. Мне не известны пакеты / функции R, которые позволяют читать файл xls / xlsx напрямую из необработанного вектора (вероятно, такие функции существуют, я просто не знаю).

Здесь вы можете записать тело в файл и затем прочитать его обычным способом, а затем:

library(RestRserve)
library(readxl)

app = Application$new()
app$add_post(
  path = "/xls",
  FUN = function(request, response) {
    fl = tempfile(fileext = '.xlsx')
    xls = request$get_file("xls")

    # need to drop attributes as writeBin() 
    # can't write object with attributes
    attributes(xls) = NULL
    writeBin(xls, fl)
    xls = readxl::read_excel(fl, sheet = 1)
    response$set_body("done")
  }
)

backend = BackendRserve$new()
backend$start(app, http_port = 65080)

Также учтите, что аргумент content_type предназначен для кодирования ответа, а не для декодирования запроса.

...