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

时间:2019-03-21 18:51:29

标签: r post rounding precision plumber

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

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

任何想法都可能是问题所在-为什么双打取整,取整在哪里进行?如何防止这种情况?  -我尝试了其他请求标头设置,但无法正常工作。  -我尝试将受影响的双列作为矢量或列表发送,但得到相同的“强制”舍入。

预先感谢

1 个答案:

答案 0 :(得分:1)

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

https://www.rplumber.io/docs/rendering-and-output.html#rendering-and-output

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

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)