Существует элемент класса S4 в списке

У меня есть список с объектами S4. Мне нужно проверить, присутствует ли один объект S4 в этом списке. Я попытался с некоторыми альтернативами, найденными на этой странице, но безуспешно:

Я пытался с существует:

exists(foo,where=my_list)

Error in list2env(list(<S4 object of class "Atributo">, <S4 object of class "Atributo">,  
;names(x) must be a character vector of the same length as x

С матча:

match(foo, my_list)

'match' requires vector arguments

Бинарный оператор соответствия дает тот же результат% в%:

foo %in% my_list

'match' requires vector arguments

И is.element:

is.element(foo,my_list)

Error in match(el, set, 0L) : 'match' requires vector arguments

Например, я создал 5 элементов и составил список только с 3 из них. Мне нужно знать, есть ли один конкретный элемент в списке:

setClass("foo", representation = representation(bar = "numeric"))

one <- new("foo", bar = 12)
two <- new("foo", bar = 13)
three <- new("foo", bar = 14)
four <- new("foo", bar = 15)
five <- new("foo", bar = 16)

mylist <- list(one,two,three)

Я хотел бы проверить, существует ли определенный элемент в списке, например:

usefull_function(four,my_list)

FALSE

usefull_function(two,my_list)

TRUE

Я знаю, являются ли они элементами S4, я могу проверить, существует ли среда в списке сред. ¿Как бы это был элегантный / быстрый способ сделать это?

Спасибо.

1 ответ

Сочетание sapply, any а также is должно сработать.

setClass("foo", representation = representation(bar = "numeric"))

baz <- new("foo", bar = 42)
mylist <- list("hello", baz, 13)


any(sapply(mylist, is, class2 = "foo"))

Что касается имен объектов в списке, я могу думать только о двух

Добавить имена, когда список построен

mylist <- list(one=one,two=two,three=three)
"one" %in% names(mylist)

Сравнить элементы объекта

mylist <- list(one,two,three)
any(sapply(mylist, function(x) identical(one, x)))
[1] TRUE

any(sapply(mylist, function(x) identical(four, x)))
[1] FALSE

ПРИМЕЧАНИЕ. - Во втором подходе предполагается, что элементы внутри объектов различны, поэтому предпочтительно использовать 1-й подход.

У меня просто та же проблема, но я думаю, что вы должны изменить определение класса s4 из

setClass("foo", representation = representation(bar = "numeric"))

в

setClass("foo", representation = representation(name='character',bar = "numeric"))

затем

one <- new("foo",name='one', bar = 12)
two <- new("foo", name='two', bar = 13)
three <- new("foo",name='three', bar = 14)
four <- new("foo", name='four',bar = 15)
five <- new("foo", name='five',bar = 16)

mylist <- list(one,two,three)

тогда вы можете разработать функцию, чтобы собрать все имена из объекта и сравнить их имена

Другие вопросы по тегам