json - 如何在 R 中使用 Plumber 使用一组 JSON 对象

标签 json r api plumber

我最近一直在 R 中试验 Plumber,当我使用 POST 请求传递以下数据时取得了成功;

{"Gender": "F", "State": "AZ"}

这允许我编写一个如下所示的函数来返回数据。
#* @post /score
    score <- function(Gender, State){
      data <- list(
        Gender = as.factor(Gender)
        , State = as.factor(State))

      return(data)
      }

但是,当我尝试 POST 一组 JSON 对象时,似乎无法通过该函数访问数据
[{"Gender":"F","State":"AZ"},{"Gender":"F","State":"NY"},{"Gender":"M","State":"DC"}]

我收到以下错误
{
    "error": [
        "500 - Internal server error"
    ],
    "message": [
        "Error in is.factor(x): argument \"Gender\" is missing, with no default\n"
    ]
}

有没有人知道 Plumber 如何解析 JSON?我不确定如何访问字段并将其分配给向量以对数据进行评分。

提前致谢

最佳答案

我在这里看到两种可能的解决方案。第一个是基于命令行的方法,我假设您正在尝试。我在 Windows 操作系统上对此进行了测试,并使用了基于列的 data.frame 编码,由于 JSON 字符串长度较短,我更喜欢这种编码。确保正确转义引号以避免“参数“...”丢失,没有默认错误:

curl -H "Content-Type: application/json" --data "{\"Gender\":[\"F\",\"F\",\"M\"],\"State\":[\"AZ\",\"NY\",\"DC\"]}" http://localhost:8000/score
# [["F","F","M"],["AZ","NY","DC"]]
第二种方法是 R 原生的,具有将所有内容集中在一个地方的优势:
library(jsonlite)
library(httr)

## sample data
lst = list(
  Gender = c("F", "F", "M")
  , State = c("AZ", "NY", "DC")
)

## jsonify
jsn = lapply(
  lst
  , toJSON
)

## query
request = POST(
  url = "http://localhost:8000/score?"
  , query = jsn # values must be length 1
)

response = content(
  request
  , as = "text"
  , encoding = "UTF-8"
)

fromJSON(
  response
)
#      [,1]                    
# [1,] "[\"F\",\"F\",\"M\"]"   
# [2,] "[\"AZ\",\"NY\",\"DC\"]"
请注意 httr::POST()需要一个长度为 1 的值列表作为查询输入,因此应事先对数组数据进行 jsonified。如果你想完全避免额外的包导入,一些 system() , sprintf()等魔法应该可以解决问题。
最后,这是我的 水管工端点(住在 R/plumber.R 并稍微浓缩):
#* @post /score
score = function(Gender, State){
  lapply(
    list(Gender, State)
    , as.factor
  )
}
以及启动 API 的代码:
pr = plumber::plumb("R/plumber.R")
pr$run(port = 8000)

关于json - 如何在 R 中使用 Plumber 使用一组 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48667477/

相关文章:

R 绘图在我的 Windows 上不起作用,但plot.default 可以

r - 如何在 R 中迭代地更改观测值?

r - 是否可以在不给它一个对象的情况下运行一个函数?

javascript - 使用 javascript 或最佳替代方案从存储在数组中的图像 url 下载图像

api - 使用 OpenSearch Python bulk api 将数据插入多个索引

c# - 让 WebAPI Controller 向另一个 REST 服务发送 http 请求

javascript - 来自 json 文件的图像未显示在网站上

java - 我应该将 json 字符串解析为 json 对象还是直接操作字符串

python - 从 2 个 json api 创建 json 并应用于每个轴的函数

api - YQL:选择 woeid 返回 null