我必须修改%in%
运算符,该运算符将在列表中找到对象。
我有一个列表:
list1 <- list(c(5,6), 6, list(2, c(5, 6)), "string")
测试这些值后,未经修改的%in%
运算符:
c(5,6) %in% list1
6 %in% list1
2 %in% list1
list(2, c(5,6)) %in% list1
将返回:
TRUE
TRUE
FALSE
FALSE
但是对于list(2, c(5,6)) %in% list1
,我需要它返回TRUE
,因为它是此列表的元素。
我必须在不使用循环的情况下实现它,并且陷入困境。
答案 0 :(得分:4)
nil
应该给您您想要的东西:
purrr::has_element
您还可以编写自己的infix函数,该函数环绕该函数,其工作方式类似于purrr::has_element(list1, c(5,6))
#[1] TRUE
purrr::has_element(list1, 6)
#[1] TRUE
purrr::has_element(list1, 2)
#[1] FALSE
purrr::has_element(list1, list(2, c(5,6)))
#[1] TRUE
:
%in%
答案 1 :(得分:1)
如果您只想在列表中检测到此元素,而不一定要定义一个运算符,则无需花哨。我们可以简单地添加另一个list
,以表明它是我们感兴趣的单个元素:
list(list(2, c(5,6))) %in% list1
# [1] TRUE
更新:虽然这可能很直观,但实际情况还不清楚。正如@BenBolker所观察到的,%in%
是基于match
的,其描述是
将因子,原始向量和列表转换为字符向量,并且 然后将x和table强制转换为通用类型(两者中的后者 类型以R的顺序排列,逻辑<整数<数字<复数< 字符)。
因此,似乎list(list(2, c(5,6)))
和list1
首先(以某种方式)转换为字符向量。由于我们需要维护结构并整理一个直接意味着合理含义的明智猜测
as.character(list(list(2, c(5,6)))) %in% as.character(list1)
其中
as.character(list(list(2, c(5,6))))
# [1] "list(2, c(5, 6))"
as.character(list1)
# [1] "c(5, 6)" "6" "list(2, c(5, 6))" "string"