我正在尝试根据其中一个元素的值从对象列表中创建子列表。例如,我创建了一个对象类:
setClass("Foo",representation(Attrib = "vector"))
然后我创建了这个类的对象列表:
CreateData = function() { new("Foo",Attrib=sample(0:1,5,replace=TRUE)) }
FooSet = CreateData()
for(i in 1:20) { FooSet=c(FooSet,CreateData()) }
现在我想创建一个列表的子集,其中包含Attrib的第一个元素为1的集合。理想情况下,我会这样说:
FooSubset = FooSet[FooSet@Attrib[1] == 1]
但是,这会导致错误,因为FooSet [i]是一个对象的列表,而不是对象本身;要获取对象,我需要做FooSet [[i]]。是否有一种简单的方法可以使逻辑索引向量适当地检查对象元素,或者其他一些方法来做这个缺少for循环?
答案 0 :(得分:1)
您可以在索引中使用sapply()
。它仍然是一个循环,但你有一个列表,所以你将不得不有一个循环来抓取元素。
FooSet[sapply(FooSet, slot, "Attrib")[1, ] == 1]
或
FooSet[sapply(FooSet, function(x) x@Attrib[1]) == 1]