Существует элемент класса 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)
тогда вы можете разработать функцию, чтобы собрать все имена из объекта и сравнить их имена