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

R 修改%in%运算符以在列表中查找对象,r,list,R,List,我必须修改%运算符中的%,该运算符将在列表中查找对象 我有一份清单: list1purrr::has_元素应该能满足您的需求: 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 您还可以编写自己的

我必须修改%运算符中的
%,该运算符将在列表中查找对象

我有一份清单:
list1
purrr::has_元素
应该能满足您的需求:

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
您还可以编写自己的中缀函数,该函数围绕此函数运行,就像%
%中的
%:

`%in2%` <- function(lhs, rhs) purrr::has_element(rhs, lhs)

c(5,6) %in2% list1
#[1] TRUE
6 %in2% list1
#[1] TRUE
2 %in2% list1
#[1] FALSE
list(2, c(5,6)) %in2% list1
#[1] TRUE

`%in2%`如果您只想在列表中检测此元素,而不必定义运算符,则无需任何花哨的操作;我们可以简单地添加另一个
列表
,以明确这是我们感兴趣的单个元素:

list(list(2, c(5,6))) %in% list1
# [1] TRUE

更新:虽然这可能是直观的,但究竟发生了什么并不清楚。正如@BenBolker所观察到的,%
中的
%是基于
匹配的,其描述是

因子、原始向量和列表转换为字符向量,以及 然后x和table被强制为一个公共类型(两者中较晚的一个) R排序中的类型,逻辑<整数<数字<复数< 字符)在匹配之前

因此,似乎
list(list(2,c(5,6))
list1
首先(以某种方式)转换为字符向量。因为我们需要保持结构和顺序,所以我们可以合理地猜测它的直接含义

as.character(list(list(2, c(5,6)))) %in% as.character(list1)
在哪里


foo=list(2,c(5,6));lapply(list1,function(x)idential(x,foo))
你是在寻找一种方法来检测list1中的
列表(2,c(5,6))
,还是一定要通过修改
%in%
?类似于@d.b的方法:
f@d.b非常感谢你,它对我很好!有趣。我想我明白了为什么会这样(详细说明
?%in%”
解释了在
match()
(这是
%in%
的基础)中,列表在匹配之前被转换为字符向量);最好能解释一下/illustrate@BenBolker真有趣。我用一些猜测更新了答案。
list(list(2, c(5,6))) %in% list1
# [1] TRUE
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"