2017-02-14 4 views
0

Ich prototypiere eine Anwendung in R. Ich verwende die parallele Bibliothek und ParApply, um eine Funktion auf Spalten eines Datenrahmens auszuführen. Ich verstehe, dass dies auch auf Nicht-Parallel-/Apply-Anwendungen anwendbar ist. Ich habe eine Zeile ähnlich wie:Listen automatisch auslesen in R

myBigList <- parApply(myCluster, myInputData, 2, myFunction) 

wo myFunction ist eine, die ich geschrieben habe, nimmt einen Vektor als Eingabe. Die Funktion selbst führt ziemlich viele Operationen durch, zu denen ich nicht gehen kann. Es gibt eine Liste von Variablen verschiedener Klassen zurück. Für die Zwecke eines MWE sagen:

myFunction <- function(vectorIn){ 
    # CODE GOES HERE 
    return(list(
     mean = mean(vectorIn), 
     sd = mean(vectorIn), 
     vectorOut = sumUserFunction(vectorIn), 
     plot1 = aPlotGeneratingFunction(vectorIn), 
    )) 

Was mir zurückgegeben wird, ist eine Liste mit den Ergebnissen aus der Funktion. Ich kann Elemente aus der Liste adressieren, zB:

myBigList$Column1$mean 

Aber das ist nicht wirklich hilfreich für meine Zwecke. Ich würde gerne wissen, wie man die Liste auspackt, damit ich alle Durchschnittswerte einsehen kann. zB:

listOfMeans <- myBigList$*ALL_ITEMS*$mean 

so dass listOfMeans ein Vektor mit row.names oder data.frame mit col.names ist.

Ist das möglich? Ich kann mir eine Lösung vorstellen, die eine For-Schleife verwendet, aber das scheint nicht sehr elegant zu sein.

Ich möchte auch etwas Ähnliches mit den Plots machen, die ich zurückgebe, so dass ich automatisch ein pdf erstellen kann, das alle von ihnen enthält. Ich schätze, dass das Lernen hilft.

tl; dr: Was ist die beste Methode, um allgemeine Datennamen aus einer Liste zu extrahieren?

EDIT: Eine tatsächliche MWE

library('ggplot2') 

exampleData <- data.frame(Col1 = rnorm(100), Col2 = rnorm(100), Col3 = rnorm(100)) 

myFunction <- function(xIn){ 

    meanX <- mean(xIn) 
    sdX <- sd(xIn) 
    vecX <- xIn^2 + xIn 

    plotX <- 
    ggplot(data.frame(xIn, vecX), aes(x = xIn, y = vecX)) + 
    geom_point() 

    return(list(
    mean = meanX, 
    sd = sdX, 
    vect = vecX, 
    plot = plotX 
)) 
} 

myBigList <- apply(exampleData, 
        2, 
        myFunction) 
+2

Versuchen 'mymeans <- sapply (myBigList, \' [[\ ' "bedeuten")' wo "bedeuten" ist der Name des Elements in jeder Unterliste, die Sie extrahieren möchten –

+0

Danke, Für Elemente in meiner Liste mit einzelnen Werten gibt dies einen Vektor mit entsprechenden Namen zurück. Genau das, was ich wollte. Für Elemente in meiner Liste Contains Vektoren, dies gibt eine Liste von Vektoren, wieder sehr akzeptabel. Aber für Elemente in der Liste mit Plot-Handles (vielleicht nicht den richtigen Begriff) gibt es eine Matrix zurück. Ich kann mir nicht vorstellen, wie ich die Plots daraus umschreiben soll. – Lespied

+0

Deshalb sollten Sie ein minimal reproduzierbares Beispiel angeben. Während Sie Code gezeigt haben, können Benutzer ihn nicht wirklich testen/ausführen. Sie hätten beispielsweise eine Zeile wie 'x <- Liste (col1 = Liste (Mittelwert = 1, sd = 2), col2 = Liste (Mittelwert = 1, sd = 2), col3 = Liste (Mittelwert = 1, sd = 2)) 'oder eins einschließlich Plots und data.frames. Dann wird jemand Ihnen sagen, wie es geht –

Antwort

1

von @docendo discusimus Kommentar

mymeans <- sapply(myBigList, '[[', 'mean') 

gibt einen Vektor aller Werte speichert in Mittelwert. Um eine Liste zurück, die zum Speichern der Plot-Klasse nützlich ist, sollte der Befehl:

myplots <- lapply(myBigList, '[[', 'plot')