我有一个包含S4对象的列表。我需要检查该列表中是否存在一个S4对象。我尝试了本页中的一些替代方案但没有成功:
我尝试使用exists:
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
match的二元运算符在%:
中给出相同的结果%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 :(得分: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 :(得分:0)
我只是遇到了同样的问题,但我认为您应该修改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)
然后您可以设计函数以从对象中提取所有名称并比较其名称