2016-05-07 4 views
1

Ich habe eine benannte Liste von Daten und eine benutzerdefinierte Funktion, die ich auf die Daten anwenden möchten:Passing Liste Elementnamen als Variable Funktionen innerhalb lapply

#Some example data 
d.list <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9)) 

#A simple function to process some data, write an output graph, and return an output 
myfun <- function(data, f.name) { 
    y <- list() 
    y[1] <- data[1] + data[2] + data[3] 
    y[2] <- data[3] - data[1]/ data[2] 
    y[3] <- data[2] * data[3] - data[1] 
    svg(filename = f.name, width = 7, height = 5, pointsize = 12) 
    plot.new() 
    plot(data, y) 
    dev.off() 
    return(y) 
} 

Ich möchte nun diese über meine Liste iterieren mit sapply und eine gespeicherte Bilddatei für jede Iteration erhalten, wobei der Dateiname als Listenelementname (egasvg, b.svg, c.svg im obigen Beispiel) zusammen mit dem Datenrahmen, der die Ergebnisse der Berechnungen enthält, festgelegt wird. Als ich dies auszuführen:

#Iterate over the example data using sapply 
res <- t(sapply(d.list, function(x) myfun(data=x, 
        f.name=paste(names(d.list), ".svg", sep = "")))) 

erhalte ich den erwarteten Datenrahmen:

[,1] [,2] [,3] 
a 6 2.500 5 
b 15 5.200 26 
c 24 8.125 65 

aber ich nur mit einer Datei im Zielverzeichnis am Ende: „a.svg“

Wie kann Ich übergebe die Listenelementnamen korrekt als Parameter an die Funktion, die ich in sapply anrufe?

Antwort

4

Wenn Sie mehr als zwei Vektoren gleichzeitig iterieren (beide Ihre Daten und die Dateinamen), verwenden mapply (oder Map)

res <- t(mapply(myfun, d.list, paste0(names(d.list), ".svg"))) 
1

in der Zeit nach der OP, geschlungen es durch jedes Element die 'd.list', aber aufgerufenen Namen (d.list) in jeder der Schleife dh Aufruf eines Vektors (c("a", "b", "c")). Wir müssen die names der 'd.list' durchlaufen. Auf diese Weise können wir die einzelnen names sowie die list Elemente durch Subsetting erhalten.

lapply(names(d.list), function(x) paste0(x, ".svg")) 

Wenn wir die Funktion des OP

lapply(names(d.list), function(x) myfun(data= d.list[[x]], 
             f.name = paste0(x, ".svg"))) 
verwenden