如何编写一个将参数传递给函数的函数?

时间:2010-12-23 20:27:29

标签: function r

我在R中编写一个函数来评估模型的拟合,但每个模型都采用相同的参数。如何避免对模型的每次调用重复相同的参数?

这里可能更清楚,参数

  data=data,
  na.action = na.exclude,
  subset = block == site)

重复。

modelfit <- function(order, response, predictor, site) {
   if(order == 0) {
     m <- lm(response ~ 1, 
             data=data,
             na.action = na.exclude,
             subset = block == site)
   } else if (is.numeric(order)) {
     m <- lm(response ~ poly(predictor, order), 
             data=data,
             na.action = na.exclude,
             subset = block == site)
   } else if (order == 'monod') {
     x<-predictor
     m <- nls(response ~ a*x/(b+x),
              start = list(a=1, b=1),
              data=data,
              na.action = na.exclude,
              subset = block == site)
   } else if (order == 'log') {
     m <- lm(response ~ poly(log(predictor), 1),
             data=data,
             na.action = na.exclude,
              subset = block == site)
   }
   AIC(m)
 }

有关更好地解决这个问题的其他建议总是受到赞赏。

2 个答案:

答案 0 :(得分:5)

您可以使用...成语来执行此操作。您在函数的参数定义中包含...,然后在lm()调用包括...作为额外参数。 ...实际上是您希望传递的所有额外参数的占位符。以下是使用此方法的函数修改(未经测试):

modelfit <- function(order, response, predictor, site, ...) {
   if(order == 0) {
     m <- lm(response ~ 1, ...)
   } else if (is.numeric(order)) {
     m <- lm(response ~ poly(predictor, order), ...)
   } else if (order == 'monod') {
     x<-predictor
     m <- nls(response ~ a*x/(b+x), start = list(a=1, b=1), ...)
   } else if (order == 'log') {
     m <- lm(response ~ poly(log(predictor), 1), ...)
   }
   AIC(m)
 }

然后调用此函数并提供重复的参数来代替...

with(myData, modelfit(2, myResponse, myPredictor, mySite, data = myData, 
                      na.action = na.exclude, subset = block == mySite))

其中myResponsemyPredictormySite是您要在myData数据框中使用存在的变量。

答案 1 :(得分:2)

我想用一个简单的例子澄清加文答案中的一点:

以下是数据框d

d <- data.frame(x1 = c(1, 1, 1, 1, 2, 2, 2, 2),
                x2 = c(1, 1, 1, 2, 1, 1, 1, 2),
                y  = c(1, 1, 3, 4, 5, 6, 7, 8))

这是一个功能:

mf <- function(response, predictor, ...) {
  lm(response~predictor, ...)
}

请注意

mf(d$y, d$x1, subset = d$x2 == 1, data = d)

有效,但

mf(y, x1, subset = x2 == 1, data = d)

没有。