平台: -具有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位。
任何想法都可能是问题所在-为什么双打取整,取整在哪里进行?如何防止这种情况? -我尝试了其他请求标头设置,但无法正常工作。 -我尝试将受影响的双列作为矢量或列表发送,但得到相同的“强制”舍入。
预先感谢
答案 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)