我正在做一个项目来分析函数输出,所以需要在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)
但我正在寻找的是一种列出所有模型的方法,并循环,和/或以通用方式调用score函数。例如:
models = c("model1")
scoreModel1 = score(df$y,df$x,models[1])
上面代码的错误是
Error in score(y, X, model) :
could not find function "model"
我尝试了as.function(),列出和取消列出参数,但没有任何效果
models = c(model1)
models = list(model1)
models = list("model1")
预先感谢你的帮助。
4条答案
按热度按时间mpbci0fu1#
对于那些从谷歌来到这里想知道如何将函数作为参数传递的人来说,这里有一个很好的例子:
这是从哈德利的书找到here
uxhixvfz2#
你的列表对象可以直接是函数。也许你可以从这个结构中得到一些用处,或者接受罗兰的建议,传递公式。Richiemorrisroe的答案可能更清晰。
ogq8wdun3#
match.fun
是你的朋友。它是apply
tapply
等人用于相同目的的东西。注意,如果你需要将参数传递给模型拟合函数,那么你要么需要将所有这些都捆绑到一个函数中,如sofunction(x) sum(x==0, na.rm=TRUE)
,要么将它们作为列表提供,并使用do.call
,如sodo.call(myfunc, funcargs)
。希望这个有用。
2lpgd9684#
另一个答案:
将函数作为变量传递的示例:
祝好运