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

Raa*_*aad 3 null arguments r function

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

问题是,有时我想使用默认参数,有时我想指定我自己的参数。就我而言,有时我想修改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))
Run Code Online (Sandbox Code Playgroud)

由于多种原因,这不起作用,但我希望您能理解。我试图使用类似的东西作为第二个参数来解释逗号:

noquote( ifelse( !is.null(family), paste0(noquote("family="), family, "(),") ) )
Run Code Online (Sandbox Code Playgroud)

如果您有任何想法,请告诉我。

MrF*_*ick 5

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

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)
Run Code Online (Sandbox Code Playgroud)

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

否则,您可以使用ifwith 部分语句来填充更多值。

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