我在R plumber API中遇到了一些关于difftime的问题。用R试过了,它工作正常。然而,当转向API时,其返回“
使用R管道工
#' @param lease_start date
#' @param lease_end date
#' @post /difference
function(lease_start, lease_end){
lease_start <- as.Date("01/01/2018", format = "%d/%m/%Y")
lease_end <- as.Date("01/01/2019", format = "%d/%m/%Y")
lease_end <- as.Date(lease_end, ", "%d/%m/%Y")
difference <- lease_end - lease_start
difference
}
字符串
结果:
simpleError:没有方法作为JSON S3类:差分时间
有谁知道是什么问题以及如何解决它?非常感谢!
4条答案
按热度按时间g0czyy6m1#
为了将R对象返回给API客户端,{plumber}将该对象转换为API客户端可以理解的格式。这个过程被称为“序列化”,使用Plumber渲染输出。默认情况下,{plumber}使用JSON序列化和{jsonlite} R包将R对象转换为JSON。
正如@Steve所解释的那样,在R中,两个日期的差异返回一个无法处理为JSON的difftime对象。然后,{jsonlite}引发问题中提到的错误,如以下代码所示
字符串
一种解决方案是将difftime对象转换为数字或字符。通过这种方式,可以将对象转换为JSON:
型
另一种解决方案是通过
print()
、format()
或cat()
控制序列化返回文本对象。这可以通过添加{plumber}提供的替代序列化程序来完成型
以类似的方式,您可以使用
@serializer cat
或@serializer print
然而,我更喜欢的解决方案是在列表中返回difftime对象的两个部分(单位和实际差值)。
型
优点是列表可以由{plumber}默认序列化程序处理,并且不会引发错误
型
由reprex package(v2.0.1)于2022-02-26创建
bq3bfh9z2#
对不起,我的错误复制代码:具体代码如下:
字符串
代码运行良好,没有转向API,结果是365天。有了上面提到的代码,它给了我错误“”
cuxqih213#
这一行--
difference <- lease_end - lease_start
将创建一个名为difftime
的R特定对象,它不能被Plumber正确解析。你可以尝试在最后将
difference
转换为字符或整数as.character(difference)
或as.integer(difference)
,它将工作3z6pesqy4#
返回json output
toJSON(difference,force = TRUE)
时可以使用force =True