如何将RDS文件发送到R管道工API?

yhxst69z  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(89)

我使用R管道工API。我已经创建了一个非常简单的API来接收RDS文件(data.frame)。在这个收到的rds上,我执行一些基本操作,然后返回这个修改后的data.frame。
使用swagger,我可以图形化地测试我的API是否工作。我无法使RDS文件工作。我尝试按照这里的例子How to send rds file to plumber API using httr package ?,但没有成功
下面是我的代码:

library(plumber)
library(dplyr)
library(magrittr)
library(data.table)

#* Get dataframe and create feature
#* @parser multi
#* Add rds parser
#* @parser rds
#* @param df:file
#* @post /dataframe
function(req, res, df) {
  str(df)
  return(df[,1])
}

我在swagger UI中得到了这个错误:

w1e3prcc

w1e3prcc1#

在这里插入一个browser(),看看为什么你的代码失败了:

function(req, res, df) {
  browser()
  str(df)
  return(df[,1])
}

对我来说,我从saveRDS(head(mtcars), file="mt.rds")开始生成,然后上传。从这里

Browse[2]> df
$mt.rds
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1

所以你需要使用df[[1]](或者一个名字,如果你知道的话):

function(req, res, df) {
  return(df[[1]][,1])
}

有了这个运行,我可以做到:

library(httr)
library(magrittr)
res <- 
  POST(
    "http://127.0.0.1:9999/dataframe",
    body = list(
      # send the file with mime type `"application/rds"` so the RDS parser is used
      df = upload_file("mt.rds", "application/rds")
    )
  ) %>%
  content()
str(res)
# List of 6
#  $ : int 21
#  $ : int 21
#  $ : num 22.8
#  $ : num 21.4
#  $ : num 18.7
#  $ : num 18.1

相关问题