2012-04-05 7 views
1

Ich habe nie eine befriedigende Antwort auf diese Frage gefunden. Angenommen, ich habe eine Funktion:Übergabe eines Listenarguments an llply

foo <- function(a,b,c) { 
... 
} 

a ist eine Liste viele data.frame Objekte

b ist eine Liste, die eine spezielle Klasse von Daten (Klasse ppp aus der Bibliothek spatstat, ob das hilft vorhanden) enthält.

c ist eine ganze Zahl.

und ich möchte eine Liste durch diese Funktion drücken:

result <- llply(a, foo, b,c) 

Die Namen der Listenelemente in b entsprechen die Spalte „Typ“ in der data.frames in Liste a. Also innerhalb foo Funktion kann ich schnell tun:

id <- which(names(b) == unique(a$type)) 
baseline_pattern <- b[[id]] 

jede zugrunde liegende räumlichen Muster in b mit der rechten data.frame in einem anzupassen. Es gibt ungefähr 10 Artikel in b und 1000 Artikel in einem. Leider funktioniert das nicht, weil llply (oder lapply im Allgemeinen) versucht, ein Listenelement unter a Zeit, auch für die Argumentliste b und die beiden Zeilen des Codes die richtige Liste Element in b mit dem richtigen Datenrahmen schlägt fehlschlägt, weil die Funktion hat nicht mehr die gesamte Liste b. Gibt es einen Weg dazu?

In einer Prise könnte ich eine andere Liste (effektiv kombinieren a und b) erstellen, wobei jedes Listenelement selbst eine Liste mit der Länge 2 ist, die das data.frame und das entsprechende Punktmusterobjekt enthält. Dies führt jedoch zu Tausenden von redundanten Kopien (und macht die Ausführung dieser Operation auf einem Cluster weitaus weniger effizient).

UPDATE: Ich plane, dies in eine mclapply um dies auf einem Cluster zu betreiben. Ich kann das nicht mit mapply (es sei denn, es gibt eine mcmapply).

+0

Wie sich herausstellt, gibt es ein 'mcmapply' in R 2.15.0. Zeit für ein Upgrade ...? –

Antwort

1

Ich bin noch nicht vollständig aufgewacht, aber es klingt wie Sie mapply mit MoreArgs=list(b, c) verwenden möchten.