3

平台: - 具有 16 个内核和 128 GIG RAM 的 AWS 实例。- 红帽企业 7.5。- R. - RStudio 服务器。- Plumber API 将 R 函数公开为 Web 服务端点。- 客户端是 Excel VBA。

问题: - 具有不同类型列的数据表,包括双精度、整数和字符串数据。- 在 R 端点函数发送响应(表)之前,当我检查数据表中的双数据时,所有条目的长度都在 6 到 10 位小数之间。- 一旦表格以 JSON 格式到达客户端,99% 的双列将四舍五入到小数点后 4 位。

知道可能是什么问题 - 为什么双打会四舍五入,四舍五入发生在哪里,我该如何防止这种情况发生?- 我尝试了不同的请求标头设置,但它不起作用。- 我尝试将受影响的双列/s 作为向量/s 或列表/s 发送,但我得到相同的“强制”舍入。

提前致谢

4

1 回答 1

5

这并没有很好地记录,但事实证明这是使用jsonlite::toJSON序列化程序 ( digits = 4) 中的默认值的结果。这里有一些细节:

https://www.rplumber.io/articles/rendering-output.html

我看不到如何从参数化中将参数传递给该参数,但这是一种解决方法:

library(plumber)

#* @apiTitle A Test API

#* Run a simple function
#* @get /

function(req, res) {
  x <- rnorm(1)
  res$body <- jsonlite::toJSON(x, digits = NA)
  res
}


# plumb("plumber_1.R")$run(port = 5762)
# Save this file as e.g. "plumber_1.R" and run the commented line

然后你应该能够得到这样的响应:

library(httr)
y <- GET("http://127.0.0.1:5762/")
content(y, as = "text")
[1] "[-0.982448323838634]"

因此,无论您的函数的结果是什么,使用 对其进行预序列化jsonlite::toJSON(..., digits = NA),并将其直接存储在响应体中,然后返回响应对象。


事实证明,有一种“正确”的方法可以做到这一点,我通过将其归档为 GitHub 问题https://github.com/trestletech/plumber/issues/403发现了这一点。但是,看起来这个版本还没有在 CRAN 上,所以你可以同时使用上面的修复。

在您的 API 定义中,像这样指定序列化程序:

#' @serializer json list(digits = 12)

或者专门针对 json

#' @json(digits = 12)

于 2019-03-21T19:58:15.627 回答