Как мне написать функцию, которая передает аргументы функциям внутри? - PullRequest
2 голосов
/ 23 декабря 2010

Я пишу функцию в 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 ]

5 голосов
/ 24 декабря 2010

Вы можете использовать идиому ..., чтобы сделать это. Вы включаете ... в определение аргумента своей функции, а затем в вызовы 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))

, где myResponse, myPredictor и mySite - переменные, которые вы хотите использовать, существует в вашем myData фрейме данных.

2 голосов
/ 24 декабря 2010

Я хотел бы уточнить точку в ответе Гевина на упрощенном примере:

Вот кадр данных 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)

нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...