实施运营商

时间:2019-01-27 10:17:56

标签: r operators

我需要实现%in%运算符,如果左边的点在右边的列表中,则给出TRUE,反之则给出FALSE。问题是我不能使用循环和任何其他程序包。

创建列表

ell <- list( 2, c( 2, 5), list( c( 2, 8)), "test")

列表中的元素

  • 2
  • c(2, 5)
  • list(c(2, 8))
  • "test"

测试元素

2 %in% ell
# TRUE

5 %in% ell
# FALSE

list(c(2, 8)) %in% ell
# TRUE

list(list(2, 8)) %in% ell
# FALSE

"test" %in% ell
# TRUE

1 个答案:

答案 0 :(得分:1)

%in%是一个运算符,用于标识第一个参数是否为第二个参数的子集。因此,%in%无法实现您期望的功能。这是通过sapply()获得所需内容的另一种解决方案。例如:

any(sapply(ell, identical, list(c( 2, 8))))
# [1] TRUE
any(sapply(ell, identical, list(list( 2, 8))))
# [1] FALSE

您可以自己定义一个自定义运算符以实现上述方法。我将其命名为%IN%

`%IN%` <- function(a, b){
  any(sapply(b, identical, a))
}

2 %IN% ell
# [1] TRUE
5 %IN% ell
# [1] FALSE
list(c(2, 8)) %IN% ell
# [1] TRUE
list(list(2, 8)) %IN% ell
# [1] FALSE
"test" %IN% ell
# [1] TRUE