我很困惑为什么%in%
和'=='
会给出不同的结果:
day_string <- '2017-07-20'
day_date <- as.Date(day_string)
day_string == day_date #TRUE
day_string %in% day_date #FALSE
来自%in%
帮助:
%in%
目前定义为"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0
因此,如果我理解正确,因为match
强制日期为字符(但首先是数字),
day_string %in% day_date
被翻译为
match(day_string, as.character(as.numeric(day_date)), nomatch = 0) > 0
然而'=='
帮助说它也强迫不同类型。 '=='
在上面的例子中实际做了什么,为什么它的行为与%in%
不同?
答案 0 :(得分:3)
在?==
&#34; 的帮助下如果两个参数是不同类型的原子向量,则一个被强制为另一个的类型&#34;
所以我想虽然==
有两个相同的类型向量要比较,但%in%
正在尝试将日期与字符进行比较。
但是,这只发生在日期Vs字符,即
as.character(5) %in% 5
#[1] TRUE
as.factor('abc') %in% 'abc'
#[1] TRUE
5 %in% 5L
#[1] TRUE
对于OP,如@Cath所述,df_date
首先转换为数字,然后转换为字符,因此最终比较是,
as.character(as.numeric(day_date))
#[1] "17367"
as.character(as.numeric(day_date)) %in% day_string
#[1] FALSE
仔细检查,
'17367' %in% as.Date(day_string)
#[1] TRUE
答案 1 :(得分:1)
关系运算符"=="
是(如?"=="
中所述)一个泛型函数,它具有/可以直接("==.class"
)或通过Ops
通用定义的方法组(Ops.class
)。这样的函数极有可能有方法来计算R的基类,例如&#34; Date&#34;类似于"=="
到?Ops.Date
的情况,可以按预期工作。我们可以看看&#34;日期&#34; methods(class = "Date")
的泛型函数支持class。
另一方面,match
(及其包装"%in%"
)不是通用的,不一定能指望&#34;类&#34;其参数的属性(即使是R自己的类)。如果它所考虑的类是因为它明确地设计为考虑特定类,并且在相应的帮助页面中记录了这样的事实 。例如,{&#34; POSIXlt&#34; class(day_string %in% as.POSIXlt(day_date)
按需工作)。因此,"%in%"
忽略了&#34; day_date&#34;它所看到的只是它传递了typeof(day_date)
(unclass(day_date)
)和typeof(day_string)
,其中适当的强制措施(比如as.character.default(day_date)
)根据到?match
。