2016-02-16 3 views
0

У меня есть список объектов 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 элементы Я могу проверить, существует ли среда в списке сред. ¿Каким будет элегантный/быстрый способ сделать это?

спасибо.

ответ

0

Комбинация 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-й подход.

+0

Проблема с этой реализацией заключается в том, что у меня всегда будут объекты класса «foo» в списке. Например, у меня есть «baz» и «baz2», и вам нужно проверить, существует ли «baz», а не «baz2» –

+0

@FelipeGonzalez, о, поэтому вы ищете имя объекта в отличие от класса? или оба? – cdeterman

+0

Название не имеет значения. Например, у меня есть 10 элементов класса «foo» и только 5 из них в списке, мне нужно проверить, есть ли один элемент в списке. Точное название того, как оно было объявлено, на самом деле не имеет значения. –