2017-03-16 61 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

相關問題