Измените оператор% in%, чтобы найти объект в списке. - PullRequest
0 голосов
/ 18 января 2019

Мне нужно изменить оператор %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 голосов
/ 18 января 2019

В случае, если все, что вам нужно, это обнаружить этот элемент в списке, а не обязательно определять оператора, вам не нужно ничего причудливого; мы можем просто добавить еще один list, чтобы было ясно, что это интересующий нас элемент:

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

Обновление: , хотя это может быть интуитивно понятно, что именно происходит, не так ясно. Как заметил @BenBolker, %in% основан на match, описание которого гласит

Факторы, необработанные векторы и списки преобразуются в символьные векторы, и затем x и таблица приводятся к общему типу (последний из двух типы в порядке R, логическое <целое <числовое <сложное < символ) до сопоставления. </p>

Итак, казалось бы, 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"   
0 голосов
/ 18 января 2019

purrr::has_element должен дать вам то, что вы хотите:

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%:

`%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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...