2016-05-20 12 views
1

Was ist der R-idiomatische Weg zum Erstellen einer Liste durch Anwenden einer Liste von Funktionen auf eine Liste von Argumenten?Anwenden einer Liste von Funktionen auf eine Liste von Argumenten

Zum Beispiel gegeben eine Liste von Funktionen und eine Liste Argumente, in gleicher Anzahl (zum Beispiel drei),

fncs <- list(f1, f2, f3) 
args <- list(x1, x2, x3) 

Ich möchte die Liste der Funktionswerte erhalten,

fnc_vals <- list(f1(x1), f2(x2), f3(x3)) 

Mit anderen Worten, ich möchte eine verallgemeinerte Form der Basis-R-Funktion mapply auf die Listen fncs und args anwenden (die eine einzelne Funktion auf eine Liste von Argumenten anwendet).

Dies ist leicht getan werden kann:

dapply <- function(args, fncs, ...) { # "diagonal" apply 
    lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...)) 
} 

fnc_vals <- dapply(args, fncs) 

jedoch meine Augen zu, dann ist dies ungeschickt, weil es natürlich, wenn möglich in R sein würde, ohne-Verrenkungen paarweise durch die Funktionen ausführen und Argumente zum Erzeugen der gewünschten Funktionswertliste; in Python, das so gehen würde:

fncs = [f1, f2, f3] 
args = [x1, x2, x3] 
fnc_vals = [f(x) for f, x in zip(fncs, args)] 

Kann diese „flink“ Konstruktion in R implementiert werden, wie gut?

+2

Versuchen Sie mit 'Map' z. B.' Map (Funktion (x, y) x (y), fncs, args) ' – akrun

Antwort

3

können Sie verwenden Map (die mapply mit unterschiedlichen Vorgaben ist) mit do.call:

fncs <- list(mean, median, sd) 
args <- list(1:5, 11:13, c(1,1,1,2)) 
Map(function(f, x) do.call(f, list(x)), fncs, args) 
#[[1]] 
#[1] 3 
# 
#[[2]] 
#[1] 12 
# 
#[[3]] 
#[1] 0.5 

Die anonyme Funktion notwendig ist, weil do.call eine list für das zweite Argument muss.

Oder weil Sie sowieso eine anonyme Funktion schreiben, können Sie einfach Map(function(f, x) f(x), fncs, args) verwenden, wie @akrun herausstellt.

+0

Genau das, was ich mir erhofft hatte. Vielen Dank! – egnha