Lubridate %--%
间隔运算符会针对NA的某些配置而不是NA发出错误。特别是,为什么第四次调用以下%--%
会返回错误?这是一个错误吗?
> library(lubridate)
> c(ymd("1980-10-14"), ymd("1980-10-14")) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
[1] 1980-10-14 10:00:00 AEST--1981-10-14 10:00:00 AEST
[2] 1980-10-14 10:00:00 AEST--1982-10-14 10:00:00 AEST
> c(ymd("1980-10-14"), NA) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
[1] 1980-10-14 10:00:00 AEST--1981-10-14 10:00:00 AEST
[2] NA--NA
> c(NA, NA) %--% c(ymd("1980-10-14"), ymd("1982-10-14"))
[1] NA--NA NA--NA
> c(NA, ymd("1980-10-14")) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
Error in as.POSIXct.numeric(start) : 'origin' must be supplied
请注意
> NA %--% ymd("1981-10-14")
[1] NA--NA
> ymd("1981-10-14") %--% NA
[1] 1981-10-14 UTC--NA
答案 0 :(得分:2)
异常发生在第四个示例中,因为c
函数在第一个参数为NA时返回数字类向量。另一方面,当第一个参数是对`ymd:
library(lubridate)
c(NA, ymd("1980-10-14"))
#[1] NA 340329600
class( c(NA, ymd("1980-10-14")) )
#[1] "numeric"
library(lubridate)
class( c( ymd("1980-10-14")) )
#[1] "POSIXct" "POSIXt"
class( c( ymd("1980-10-14"), NA) )
#[1] "POSIXct" "POSIXt"
这也可以解释其他异常情况。可能需要修改一些高于我的工资等级的代码。
> getAnywhere(c.POSIXct)
2 differing objects matching ‘c.POSIXct’ were found
in the following places
package:base
registered S3 method for c from namespace base
namespace:base
namespace:lubridate
Use [] to view one of them
答案 1 :(得分:2)
这是因为c(NA,thing)
不会被视为c(thing,NA)
:
> is.POSIXct(c(NA, ymd("1980-01-01")))
[1] FALSE
> is.POSIXct(c(ymd("1980-01-01"),NA))
[1] TRUE
在第一种情况下,使用base::c
,因为第一个参数是NA
。在第二种情况下,调用c.POSIXct
是因为第一个参数是POSIXct
。因此,在第一种情况下,所有内容都会减少到数字向量。
可能的解决方法是不构造这样的向量:
> c(NA, ymd("1980-10-14")) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
Error in as.POSIXct.numeric(start) : 'origin' must be supplied
但是要使用ymd
来构建正确类型的向量,方法是在向量中提供带有NA的向量:
> ymd(c(NA, "1980-10-14")) %--% ymd(c("1981-10-14","1982-10-14"))
[1] NA--NA 1980-10-14 UTC--1982-10-14 UTC
请注意%--%
运算符的代码可以通过键入interval
来查看 - 它只是一个别名。
仍然很奇怪NA %--% ymd()
是NA-NA但ymd() %--% NA
有一个有效的开始......可能是另一个错误。