Jim*_*ier 5 variables arguments r function
我正在研究一个项目来分析函数输出,所以需要在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)
}
Run Code Online (Sandbox Code Playgroud)
我可以使用有效的y和X垫来调用此代码
df <- data.frame(x=rnorm(5),y=runif(5))
scoreModel1 = score(df$y,df$x,model1)
Run Code Online (Sandbox Code Playgroud)
但我正在寻找的是一种列出所有模型,循环和/或以通用方式调用得分函数的方法.例如:
models = c("model1")
scoreModel1 = score(df$y,df$x,models[1])
Run Code Online (Sandbox Code Playgroud)
我用上面的代码得到的错误是
Error in score(y, X, model) :
could not find function "model"
Run Code Online (Sandbox Code Playgroud)
我玩过as.function(),列出并取消列出args,但没有任何作用.例如,以下所有args都呈现了与上面相同的错误
models = c(model1)
models = list(model1)
models = list("model1")
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助.
您的列表对象可以直接作为函数.也许你可以从这个结构中得到一些用处,或者接受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
Run Code Online (Sandbox Code Playgroud)
对于从谷歌来到这里想知道如何将函数作为参数传递的任何人,这里有一个很好的例子:
randomise <- function(f) f(runif(1e3))
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245
Run Code Online (Sandbox Code Playgroud)
它来自在这里找到的哈德利的书
match.fun是你的朋友。这是apply tapplyet al 用于相同目的的东西。请注意,如果您需要将参数传递给模型拟合函数,那么您要么需要将所有这些捆绑到一个函数中,如 so ,function(x) sum(x==0, na.rm=TRUE)要么将它们作为列表提供并使用do.calllike so do.call(myfunc, funcargs)。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
20382 次 |
| 最近记录: |