R将函数作为变量传递

时间:2012-12-26 20:59:41

标签: r function variables arguments

我正在开发一个项目来分析函数输出,所以需要在R中作为参数传递一个函数。为了澄清,我有不同数量的模型,并且我没有寻求设置模型的帮助,只是将模型函数名称传入评分函数。

这适用于直接调用,但我想让它更通用于构建模块。这是一个简短的例子:

#create a test function:
model1 = function(y,X){
fit = lm(y~X)
output = data.frame(resid = fit$residuals)
}

#score function:
score = function(y,X,model){
y= as.matrix(y) 
X = as.matrix(X)
fitModel = model(y,X)
yhat = y - fitModel$residual
output = data.frame(yhat=yhat)
}

我可以使用有效的y和X垫与

调用此代码
df <- data.frame(x=rnorm(5),y=runif(5))
scoreModel1 = score(df$y,df$x,model1)

但我正在寻找的是一种列出所有模型,循环和/或以通用方式调用得分函数的方法。例如:

models = c("model1")
scoreModel1 = score(df$y,df$x,models[1])

我使用上面的代码得到的错误是

Error in score(y, X, model) : 
could not find function "model"

我玩过as.function(),列出并取消列出args,但没有任何效果。例如,以下所有args都呈现了与上面相同的错误

models = c(model1)
models = list(model1)
models = list("model1")

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:7)

您的列表对象可以直接作为函数。也许你可以从这个结构中得到一些用处,或者接受Roland的建议并传递公式。 Richiemorrisroe的答案可能更清晰。

fun1 <- function(x,y){
    x+y
}

fun2 <- function(x,y){
    x^y
}

fun3 <- function(x,y){
    x*y
}

models <- list(fun1 = fun1, fun2 = fun2, fun3 = fun3)

models[["fun1"]](1,2)
 [1] 3
models[[1]](1,2)
 [1] 3

lapply(models, function(FUN, x, y){ FUN(x = 1, y = 2)})
$fun1
 [1] 3

$fun2
 [1] 1

$fun3
 [1] 2

答案 1 :(得分:4)

对于那些想知道如何将函数作为参数传递给Google的人来说,这是一个很好的例子:

randomise <- function(f) f(runif(1e3))
 
randomise(mean)
#> [1] 0.5029048 

randomise(sum)
#> [1] 504.245

是从哈德利的书中找到的here

答案 2 :(得分:2)

match.fun是你的朋友。这是apply tapply等人用于同一目的的内容。请注意,如果您需要将参数传递给模型拟合函数,那么您需要将所有这些函数捆绑到类似function(x) sum(x==0, na.rm=TRUE)的函数中,或者将它们作为列表提供,并使用do.call之类的do.call(myfunc, funcargs)

希望这有帮助。

答案 3 :(得分:1)

另一个回应:

models = list(model1)
scoreModel1 = score(df$y,df$x,models[[1]])

将函数作为变量传递的示例:

f_add<- function(x,y){ x + y }
f_subtract<- function(x,y){ x - y }
f_multi<- function(x,y){ x * y }

operation<- function(FUN, x, y){ FUN(x , y)}

operation(f_add, 9,2)
#> [1] 11
operation(f_subtract, 17,5)
#> [1] 12
operation(f_multi,6,8)
#> [1] 48
祝你好运