使用单个命令运行具有不同参数的函数列表

时间:2013-03-28 19:49:07

标签: r classification multicore svm nnet

我希望在同一数据上测试不同回归/分类算法(即svm,nnet,rpart,randomForest,naiveBayes等)的结果,看看哪种算法效果更好。但我需要让我的代码尽可能短而干净。要测试所有算法,我想使用包mclapply()的{​​{1}}调用来运行它们:

multicore

问题是某些算法需要额外的参数,即invisible(lapply(c("party","nnet","caret","klaR","randomForest","e1071","rpart", "multicore"), require, character.only = T)) algorithms <- c(knn3, NaiveBayes, nnet, ctree, randomForest, svm, naiveBayes, rpart) data(iris) model <- mclapply(algorithms, function(alg) alg(Species ~ ., iris)) 需要设置参数nnet()。当然,这可以通过几个size命令来修复,但有没有更简单的解决方案?

2 个答案:

答案 0 :(得分:5)

您可以做的一件事就是替换algorithms中需要使用部分函数的其他参数的那些,例如。

algorithms <- c(knn3, ctree, function(...) nnet(..., size=2))

答案 1 :(得分:1)

软件包multicore似乎不适用于Windows,但这是一种方式,只有普通lapply的简单示例:

# names of the functions as strings
algorithms <- c("lm", "glm")
# arguments for each function (empty list for those which do not need any)
arguments <- list(lm=list(model=FALSE),glm=list(family = gaussian),lm=list())

# Use lapply with do.call
output<-lapply(1:length(algorithms), function(i) do.call(what=algorithms[i],
                    args=c(list(formula=y ~ .,data=freeny),arguments[[i]])))
names(output)<-algorithms #Add names to output

现在列表output包含每个算法的输出。请注意,首先看一下此示例的输出(通过命令output$lm)看起来有点糟糕,因为lmglm的打印显示了函数调用以及摘要,并且函数调用是这里很长。

编辑:一些小调整。