【问题标题】:How can I discriminate between functions in R如何区分 R 中的函数
【发布时间】:2014-07-07 21:59:40
【问题描述】:

我一直在尝试编写能够使用不同分类功能的代码。但是,根据我使用的分类函数,参数会有所不同。我想要这样的东西:

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

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

【问题讨论】:

    标签: r classification


    【解决方案1】:

    您可以使用formals 函数来确定该函数需要哪些参数,然后相应地调用它。另请参阅 do.call 了解动态创建函数调用并调用它的方法。

    【讨论】:

      【解决方案2】:

      首先,将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=),如果没有先前的匹配项,您可以添加要执行的最后一行。

      【讨论】:

      • +1 - 不一定适用于switch,但我可以列举一些使用该类型字符输入的函数。通常,该参数被命名为method,并且接受的值列表作为默认值提供,例如,参见optim() 及其对match.arg() 的使用。恕我直言,这是推荐的方法。
      【解决方案3】:

      这里有一个可以获取字符或函数的版本。然后您可以进行字符比较以找到正确的大小写。

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

      【讨论】:

      • 谢谢,太好了。
      【解决方案4】:

      您正在寻找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
      

      【讨论】:

      • 但是先做g = max 然后f(1:4, g) 你会失望的。我认为使用字符method 是要走的路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2020-07-12
      • 2014-04-21
      • 2014-04-28
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多