作为变量的R传递函数
我正在进行一个项目,以分析函数输出,因此需要将函数作为R中的参数传入。为了澄清,我有不同数量的模型,并不寻求建立模型的帮助,只是将模型函数名称传入评分函数 这适用于直接调用,但我想让它在构建模块时更通用。下面是一个简单的例子:作为变量的R传递函数,r,function,variables,arguments,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 = fu
#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)
我在上面代码中得到的错误是
Error in score(y, X, model) :
could not find function "model"
我已经使用了as.function(),并列出和取消列出了参数,但没有任何效果。例如,以下所有参数都呈现了与上面相同的错误
models = c(model1)
models = list(model1)
models = list("model1")
提前感谢您的帮助。
match。fun
是您的朋友。这是apply
tapply
等人为了同样的目的而使用的。请注意,如果需要将参数传递给模型拟合函数,则需要将所有这些参数捆绑到一个函数中,如sofunction(x)sum(x==0,na.rm=TRUE)
,或者将它们作为列表提供,并使用do.call
如sodo.call(myfunc,funcargs)
希望这有帮助。您的列表对象可以直接作为函数。也许你可以从这个结构中得到一些用处,或者接受罗兰的建议,传递公式。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
fun1另一个响应:
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
f_add对于那些从谷歌来到这里想知道如何将函数作为参数传递的人,这里有一个很好的例子:
randomise <- function(f) f(runif(1e3))
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245
randomise[1]0.5029048
随机化(总和)
#> [1] 504.245
这是从Hadley的书中找到的根据您应该运行的代码部分给了我一个错误。如果你只处理线性模型,你可以将一个公式传递给你的评分函数。也许你应该了解btwn'['和'['之间的区别。第二个版本应该处理模型[[1]]
randomise <- function(f) f(runif(1e3))
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245