在 Plumber [=10R] 中获取 CSV 作为输入和输出 CSV
Get CSV as inoput and output CSV in Plumber API R
我想在 plumber API 中获取 CSV 的输入并将其输出为 CSV。
我可以单独进行这两项操作(借助下面所附的链接)。
但是我不能一起做。
使用来自 Github Link 的序列化程序:
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文件的方法是什么?
Links:
这适用于 Plumber 4.6.0 版,但有点老套。您可以将 write.csv
和 read.csv
替换为 fwrite
,fread
来自 data.table
或 format_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)
plumber.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)
我想在 plumber API 中获取 CSV 的输入并将其输出为 CSV。
我可以单独进行这两项操作(借助下面所附的链接)。
但是我不能一起做。
使用来自 Github Link 的序列化程序:
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文件的方法是什么? Links:
这适用于 Plumber 4.6.0 版,但有点老套。您可以将 write.csv
和 read.csv
替换为 fwrite
,fread
来自 data.table
或 format_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)
plumber.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)