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

Abe*_*Abe 2 r function

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

这里的论点可能更清楚

  data=data,
  na.action = na.exclude,
  subset = block == site)
Run Code Online (Sandbox Code Playgroud)

重复.

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)
 }
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*son 5

你可以用这个...成语来做到这一点.您...在函数的参数定义中包含,然后在lm()调用include中...作为额外参数.该...有效是所有你要传递额外的参数的占位符.以下是使用此方法的函数修改(未经测试):

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)
 }
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用此函数并提供重复的参数来代替...:

with(myData, modelfit(2, myResponse, myPredictor, mySite, data = myData, 
                      na.action = na.exclude, subset = block == mySite))
Run Code Online (Sandbox Code Playgroud)

在哪里myResponse,myPredictor以及mySite您要使用的变量是否存在myData数据框中.