R< No method asJSON S3 class: difftime>水管工误差

zzzyeukh  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(107)

我在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类:差分时间
有谁知道是什么问题以及如何解决它?非常感谢!

g0czyy6m

g0czyy6m1#

为了将R对象返回给API客户端,{plumber}将该对象转换为API客户端可以理解的格式。这个过程被称为“序列化”,使用Plumber渲染输出。默认情况下,{plumber}使用JSON序列化和{jsonlite} R包将R对象转换为JSON。
正如@Steve所解释的那样,在R中,两个日期的差异返回一个无法处理为JSON的difftime对象。然后,{jsonlite}引发问题中提到的错误,如以下代码所示

library(plumber)
library(jsonlite)

lease_start <- as.Date("01/01/2018", format = "%d/%m/%Y")
lease_end <- as.Date("01/01/2019",  format = "%d/%m/%Y")
difference <- lease_end - lease_start

class(difference)
#> [1] "difftime"
jsonlite::toJSON(difference)
#> Error: No method asJSON S3 class: difftime

字符串
一种解决方案是将difftime对象转换为数字或字符。通过这种方式,可以将对象转换为JSON:

jsonlite::toJSON(as.numeric(difference))
#> [365]
jsonlite::toJSON(as.character(difference))
#> ["365"]


另一种解决方案是通过print()format()cat()控制序列化返回文本对象。这可以通过添加{plumber}提供的替代序列化程序来完成

#* @param lease_start date
#* @param lease_end date
#* @serializer format
#* @post /difference_format
function(lease_start = "01/01/2018", lease_end="01/01/2019"){
  lease_start <- as.Date(lease_start, format = "%d/%m/%Y")
  lease_end <- as.Date(lease_end,  format = "%d/%m/%Y")
  difference <- lease_end - lease_start
  difference
}


以类似的方式,您可以使用@serializer cat@serializer print
然而,我更喜欢的解决方案是在列表中返回difftime对象的两个部分(单位和实际差值)。

list(units = units(difference), value = as.numeric(difference))
#> $units
#> [1] "days"
#> 
#> $value
#> [1] 365


优点是列表可以由{plumber}默认序列化程序处理,并且不会引发错误

jsonlite::toJSON(list(units = units(difference), value = as.numeric(difference)))
#> {"units":["days"],"value":[365]}

#* @param lease_start date
#* @param lease_end date
#* @post /difference
function(lease_start = "01/01/2018", lease_end="01/01/2019"){
  lease_start <- as.Date(lease_start, format = "%d/%m/%Y")
  lease_end <- as.Date(lease_end,  format = "%d/%m/%Y")
  difference <- lease_end - lease_start
  list(units = units(difference), value = as.numeric(difference))
}


reprex package(v2.0.1)于2022-02-26创建

bq3bfh9z

bq3bfh9z2#

对不起,我的错误复制代码:具体代码如下:

#* @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")
  difference <- lease_end - lease_start
  difference
}

字符串
代码运行良好,没有转向API,结果是365天。有了上面提到的代码,它给了我错误“”

cuxqih21

cuxqih213#

这一行--difference <- lease_end - lease_start将创建一个名为difftime的R特定对象,它不能被Plumber正确解析。
你可以尝试在最后将difference转换为字符或整数as.character(difference)as.integer(difference),它将工作

3z6pesqy

3z6pesqy4#

返回json output toJSON(difference,force = TRUE)时可以使用force =True

相关问题