使用 Plumber API 的 R POST 响应在客户端将 10 位小数位双精度(所需精度)转换为 4 位小数位双精度

Tig*_*ger 3 precision post r rounding plumber

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

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

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

提前致谢

Bri*_*ian 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
Run Code Online (Sandbox Code Playgroud)

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

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

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


事实证明,有一种“正确”的方法可以做到这一点,我通过将其作为 GitHub 问题提交https://github.com/trestletech/plumber/issues/403发现了这一点。但是,此版本似乎尚未在 CRAN 上发布,因此您可以同时使用上面的修复程序。

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

#' @serializer json list(digits = 12)

或专门用于 json

#' @json(digits = 12)

  • 谢谢布莱恩。#' @serializer json list(digits = 12) 适用于 Plumber API 0.4.7 (2认同)