2017-03-16 58 views
0

我正在尝试根据其中一个元素的值从对象列表中创建一个子列表。例如,我创建了一个对象类:有没有办法从R中的对象列表中拉取值列表?

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的第一个元素是一个。理想情况下我会说这样做:

FooSubset = FooSet[[email protected][1] == 1] 

然而,这会导致一个错误,因为FooSet [i]是一个对象的列表,而不是对象本身;为了获得对象,我需要做FooSet [[i]]。有没有一种简单的方法让逻辑索引向量适当地检查对象元素,或者其他一些方法来做到这一点吗?

+0

澄清最后位, FooSet [1] @Attrib [1] 生成错误: 错误:尝试从一个对象获取时隙 “ATTRIB”没有插槽的基本类(“列表”)。另一方面, FooSet [[1]] @ Attrib [1] 生成一个值,对于我的测试1 1 – Evan

回答

1

您可以在索引中使用sapply()。它仍然是一个循环,但你有一个列表,所以你将不得不有一个循环来抓取元素。

FooSet[sapply(FooSet, slot, "Attrib")[1, ] == 1] 

FooSet[sapply(FooSet, function(x) [email protected][1]) == 1] 
+0

酷,这解决了它。谢谢! – Evan

相关问题