如何区分R中的函数

时间:2014-05-19 20:04:25

标签: r classification

我一直在尝试编写一个能够使用不同分类函数的代码。但是,根据我使用的分类函数,参数不同。我想有这样的事情:

classification_flow <- function(classification_function, ...) {
    if (classification_function == randomForest) {
        ...
    } 
    else if (classification_function == svm) {
        ...
    }
}

当然,由于==没有为功能构建,因此无法正常工作。我尝试过使用strnamesattr,看了一下methodsUseMethod,但我无法找到一种合适的方式。

有人能帮助我吗?

谢谢,
杰斯

PS:在这种特殊情况下,我试图做的是将一个概率矩阵作为输出,所以像这样:

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)
}

如果你知道更优雅的解决方案......

4 个答案:

答案 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以了解动态创建函数调用并调用它的方法。