我正在编写一个内部有多个函数的函数(一个使用插入符包训练和测试多个模型的包装器)。
问题是,有时候我想使用默认参数,有时候我想指定自己的参数。在我的情况下,有时我想修改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, "(),") ) )
如果您有任何想法,请与我们联系。
答案 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()
}