首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取CSV作为inoput并在Plumber API R中输出CSV

获取CSV作为inoput并在Plumber API R中输出CSV
EN

Stack Overflow用户
提问于 2020-05-18 13:48:46
回答 1查看 522关注 0票数 0

我想在plumber API中获取CSV的输入,并将其输出为CSV。

我可以单独做这两件事(通过下面附加的链接)。

但是我不能一起做。

使用Github Link中的序列化程序:

代码语言:javascript
复制
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)

管道工文件:

代码语言:javascript
复制
#* @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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-19 00:03:15

这在4.6.0版本的Plumber中可以工作,但是有点老套。您可以将write.csvread.csv替换为fwritedata.table中的freadreadr中的format_csv

代码语言:javascript
复制
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)

plumber.R

代码语言:javascript
复制
#* @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
}

测试

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61863164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档