【问题标题】:R pass function in as variableR将函数作为变量传入
【发布时间】:2012-12-12 08:13:22
【问题描述】:

我正在开展一个项目来分析函数输出,因此需要在 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(),列出和取消列出 args,但没有任何效果。例如,以下所有参数都呈现与上述相同的错误

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

提前感谢您的帮助。

【问题讨论】:

  • 根据您应该运行的代码部分给我一个错误。如果您只处理线性模型,则可以将公式传递给您的评分函数。
  • 也许你应该了解一下'['和'[['的区别。第二个版本应该适用于模型[[1]]

标签: r function variables arguments


【解决方案1】:

您的列表对象可以直接是函数。也许你可以从这个结构中得到一些用处,或者接受罗兰的建议并通过公式。 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

【讨论】:

    【解决方案2】:

    对于任何从 google 来到这里想知道如何将函数作为参数传递的人,这里有一个很好的例子:

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

    来自哈德利的书here

    【讨论】:

      【解决方案3】:

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

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        另一个回应:

        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
        

        祝你好运

        【讨论】:

          猜你喜欢
          • 2020-06-07
          • 2020-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-03
          • 1970-01-01
          • 2020-11-25
          相关资源
          最近更新 更多