我一直在尝试编写一个能够使用不同分类函数的代码。但是,根据我使用的分类函数,参数不同。我想有这样的事情:
classification_flow <- function(classification_function, ...) {
if (classification_function == randomForest) {
...
}
else if (classification_function == svm) {
...
}
}
当然,由于==
没有为功能构建,因此无法正常工作。我尝试过使用str
,names
,attr
,看了一下methods
和UseMethod
,但我无法找到一种合适的方式。
有人能帮助我吗?
谢谢,
杰斯
classification_flow <- function(classification_function, train, classes, ...) {
if (classification_function == randomForest) {
mat = classification_function(train, classes, type="prob")
}
else if (classification_function == svm) {
mat = classification_function(train, classes, probabilities = T)
}
return(mat)
}
如果你知道更优雅的解决方案......
答案 0 :(得分:3)
您正在寻找substitute
:
f <- function(x, FUN) {
if (substitute(FUN) == 'max') {
print('Max invoked')
}
FUN(x)
}
> f(1:4, sum)
[1] 10
> f(1:4, max)
[1] "Max invoked"
[1] 4
答案 1 :(得分:1)
首先,输入classification_function
字符输入。
然后,使用switch
功能在两个选项之间进行选择,如下所示:
classification_flow <- function(classification_function, train, classes, ...) {
switch(classification_function,
randomForrest= {mat<-classification_function(train, classes, type="prob")},
svm = { mat<-classification_function(train, classes, probabilities = T) },
stop("You did not pick randomForrest or svm")
)
return(mat)
}
修改:添加stop
行,如果未选择任何选项,则会显示错误消息。指定所有选项(例如svm=
)后,如果没有先前的匹配项,您可以添加要执行的最后一行。
答案 2 :(得分:1)
这是一个可以获得角色或功能的版本。然后你可以进行角色比较,找到合适的案例。
classification_flow <- function(classification_function, train, classes, ...) {
if (is.function(classification_function)) {
fname <- deparse(substitute(classification_function))
} else if (is.character(classification_function)) {
fname <- classification_function
classification_function < - get(classification_function)
} else {
stop("invalid classification_function")
}
if (fname == "randomForest") {
mat = classification_function(train, classes, type="prob")
}
else if (fname == "svm") {
mat = classification_function(train, classes, probabilities = T)
}
return(mat)
}
答案 3 :(得分:1)
您可以使用formals
函数来确定函数期望的参数,然后相应地调用它。另请参阅do.call
以了解动态创建函数调用并调用它的方法。