在if中将if语句作为函数参数传递

时间:2014-09-08 23:38:50

标签: r function null arguments

我正在编写一个内部有多个函数的函数(一个使用插入符包训练和测试多个模型的包装器)。

问题是,有时候我想使用默认参数,有时候我想指定自己的参数。在我的情况下,有时我想修改tuneGrid,有时我想使用默认网格。我不能使用省略号(...)来传递这个参数,因为每个模型都需要一个单独的网格。

如何在函数参数中包含if语句?例如,

family = NULL
y <- rnorm(1000); x <- rnorm(1000)
glm(formula=y~x, if(!is.null(family)){family=family}, data=data.frame(x=x, y=y))

这不是出于多种原因,但我希望你能得到这个想法。我试图使用这样的东西作为第二个参数来说明逗号​​:

noquote( ifelse( !is.null(family), paste0(noquote("family="), family, "(),") ) )

如果您有任何想法,请与我们联系。

1 个答案:

答案 0 :(得分:3)

您可以将函数调用构建为带引号的表达式并动态更改它。像

这样的东西
addGrid<-function(expr, grid=NULL) {
    if(!is.null(grid)) {
        ll<-as.list(expr)
        ll$tuneGrid <- grid
        as.call(ll)
    } else {
        expr
    }
}

mycall<-quote(train(form= medv~., data = Boston, method = "glmboost"))
addGrid(mycall)
# train(form = medv ~ ., data = Boston, method = "glmboost")
addGrid(mycall, quote(glmBoostGrid))
# train(form = medv ~ ., data = Boston, method = "glmboost", tuneGrid = glmBoostGrid)

这将返回一个表达式,然后您可以调用eval()来执行。

否则,您可以使用带有部分语句的if来填充更多值。

mybase<-function(...) {
    train(form= medv~., data = Boston, method = "glmboost", ...)
}
result <- if (!is.null(family)) {
    mybase(family=family)
} else {
    mybase()
}