修改%in%运算符以在列表中查找对象

时间:2019-01-17 22:59:14

标签: r list

我必须修改%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,因为它是此列表的元素。

我必须在不使用循环的情况下实现它,并且陷入困境。

2 个答案:

答案 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"