2017-03-16 7 views
0

Ich versuche, eine Unterliste aus einer Liste von Objekten basierend auf dem Wert eines ihrer Elemente zu erstellen. Zum Beispiel erstelle ich eine Objektklasse mit:Gibt es eine Möglichkeit, Listen von Werten aus Listen von Objekten in R zu ziehen?

setClass("Foo",representation(Attrib = "vector")) 

Dann erstelle ich eine Liste von Objekten dieser Klasse:

CreateData = function() { new("Foo",Attrib=sample(0:1,5,replace=TRUE)) } 
FooSet = CreateData() 
for(i in 1:20) { FooSet=c(FooSet,CreateData()) } 

Jetzt möchte ich eine Teilmenge der Liste erstellen mit dem Satz, in dem die Das erste Element von Attrib ist eins. Im Idealfall würde ich dies tun, indem er sagt:

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

jedoch führt dies zu einem Fehler, wie FooSet [i] eine Liste von einem Objekt ist, anstatt das Objekt selbst; Um das Objekt zu bekommen, müsste ich FooSet [[i]] machen. Gibt es einen einfachen Weg, um den logischen Indexvektor zu bekommen, um das Objektelement in geeigneter Weise zu prüfen, oder eine andere Methode, dies zu tun, die kurz vor einer for-Schleife steht?

+0

das letzte Bit Um zu klären, FooSet [1] @Attrib [1] erzeugt den Fehler: Fehler: Versuch Slot "Attrib" von einem Objekt eines bekommen Basisklasse ("Liste") ohne Slots. Auf der anderen Seite, FooSet [[1]] @ Attrib [1] erzeugt einen Wert, für meinen Test ein 1 – Evan

Antwort

1

Sie können sapply() im Index verwenden. Es ist immer noch eine Schleife, aber Sie haben eine Liste, so dass Sie eine Schleife haben müssen, um Elemente zu greifen.

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

oder

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

cool, löst dies. Vielen Dank! – Evan

Verwandte Themen