Ich liebe do.call
. Ich liebe es, Funktionsargumente in einer Liste zu speichern und sie dann auf eine bestimmte Funktion zu übertragen.Alternative zu do.call für große Datensätze
Zum Beispiel habe ich mich oft finden diese Muster mit einer Liste der verschiedenen Vorhersagemodelle passen, mit für jedes Modell einige geteilt und einige einzigartige Parameter:
library(caret)
global_args <- list(
x=iris[,1:3],
y=iris[,4],
trControl=trainControl(
method='cv',
number=2,
returnResamp='final',
)
)
global_args$trControl$index <- createFolds(
global_args$y,
global_args$trControl$number
)
model_specific_args <- list(
'lm' = list(method='lm', tuneLength=1),
'nn' = list(method='nnet', tuneLength=3, trace=FALSE),
'gbm' = list(
method='gbm',
verbose=FALSE,
tuneGrid=expand.grid(
n.trees=1:100,
interaction.depth=c(2, 3),
shrinkage=c(.1, .01)
)
)
)
list_of_models <- lapply(model_specific_args, function(args){
return(do.call(train, c(global_args, args), quote=TRUE))
})
resamps <- resamples(list_of_models)
dotplot(resamps, metric='RMSE')
global_args
Argumente enthält, die für alle gleich sind der Modelle und model_specific_args
enthält Listen von modellspezifischen Argumenten. Ich Schleife über model_specific_args
, verketten Sie jedes Element mit global_args
, und verwenden Sie dann do.call
, um die letzte Argumentliste an die Modellanpassungsfunktion zu übergeben.
Während dieser Code visuell elegant ist, ist seine Leistung schrecklich: do.call
serialisiert das gesamte x-Dataset buchstäblich als Text und übergibt es dann an die Modellanpassungsfunktion. Wenn x ein paar GB Daten ist, verwendet dies eine wahnsinnige Menge an RAM und schlägt normalerweise fehl.
print(list_of_models[[1]]$call)
Gibt es jemand Möglichkeit, eine Liste von Argumenten an eine Funktion in R passieren, ohne do.call
oder call
zu verwenden?
Haben Sie rbind.fill aus dem plyr-Paket ausprobiert. Ich habe den Code nicht gelesen, um zu wissen, ob das Endprodukt ein Datenrahmen ist, aber wenn dies der Fall ist, ist rbind.fill wesentlich schneller als das entsprechende do.call (rbind, ...). In anderen Fällen hatte ich Erfolg mit Reduce (.) – jimmyb
@jimmyb Ich denke nicht, dass 'rbind.fill' oder' Reduce' hier angebracht sind. Ich versuche nicht, 'data.frames' zu kombinieren, ich versuche, eine Liste von Argumenten an eine Funktion zu übergeben. – Zach
Ist [dies] (http://stackoverflow.com/questions/13923301/is-there-a-work-around-for-slow-performance-of-do-callcbind-xs-in-r-2-15) Hilfe? – r2evans