【问题标题】:Get CSV as inoput and output CSV in Plumber API R在 Plumber API R 中获取 CSV 作为输入和输出 CSV
【发布时间】:2020-05-18 05:48:45
【问题描述】:

我想在管道工 API 中获取 CSV 的输入并将其输出为 CSV。

我可以单独做这两件事(借助下面的链接)。

但我不能一起做。

使用来自 Github 链接的序列化器:

serializer_csv <- function(){
  function(val, req, res, errorHandler){
    tryCatch({
      res$setHeader("Content-Type", "text/plain")
      res$setHeader("Content-Disposition", 'attachment; filename="xxx.csv"')
      res$body <- paste0(val, collapse="\n")
      return(res$toResponse())
    }, error=function(e){
      errorHandler(req, res, e)
    })
  }
}
plumber::addSerializer("csv", serializer_csv)
plumber::plumber$new("plumber-csv.R")$run(port = 8833)

管道工文件:

#* @serializer csv
#* @get /csv
function() {
  df <- data.frame(CHAR = letters, NUM = rnorm(length(letters)), stringsAsFactors = F)
  csv_file <- tempfile(fileext = ".csv")
  on.exit(unlink(csv_file), add = TRUE)
  write.csv(df, file = csv_file)
  readLines(csv_file)
}

这里,我没有使用readLines,而是直接尝试return(csv_file)。它下载一个临时文件。但是在我的本地磁盘上,该文件没有显示出来。

那么输入和输出 CSV 文件的方式可能是什么? 链接:

Link 1: StackOverFlow

Link 2: GitHub

【问题讨论】:

  • 为了清楚起见,您希望将文件作为 csv 发送给管道工,而不是希望输出也是 csv 文件?
  • 是的。这是正确的。但是我会在 CSV 上做一些操作。

标签: r plumber


【解决方案1】:

这项工作在 Plumber 版本 4.6.0 中,但有点 hacky。您可以将write.csvread.csv 替换为fwritefread 来自data.tableformat_csv 来自readr

library(plumber)
serializer_csv <- function(){
  function(val, req, res, errorHandler){
    tryCatch({
      res$setHeader("Content-Type", "text/csv")
      res$setHeader("Content-Disposition", paste0('attachment; filename="', names(val),'.csv"'))
      content <- capture.output(write.csv(val[[1]]), type = "output")
      res$body <- charToRaw(paste0(content, collapse = "\n"))
      return(res$toResponse())
    }, error=function(e){
      errorHandler(req, res, e)
    })
  }
}
plumber::addSerializer("csv", serializer_csv)
plumber::plumber$new("plumber-csv.R")$run(port = 8833)

水管工.R

#* @serializer csv
#* @post /csv
function(req) {
  req$rook.input$rewind()
  f <- tempfile()
  writeLines(req$rook.input$read_lines(), f)
  df <- read.csv(f)
  response <- list(response = df)
  response
}

测试

library(httr)
library(readr)

write.csv(mtcars, "mtcars.csv")
req <- POST("http://127.0.0.1:8833/csv", body = upload_file("mtcars.csv"))
content(req)

【讨论】:

  • 谢谢。我今天会试试这个,让你知道!
猜你喜欢
  • 2021-01-21
  • 2017-03-18
  • 1970-01-01
  • 2017-05-02
  • 2020-04-04
  • 2014-08-11
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多