Напишите функцию-обертку, чтобы успешно принимать аргументы сложения (например, подмножество) через многоточие (...)

Я пишу функцию, которая вызывает другую функцию (например, lm), и я хотел бы передать ему другие аргументы, используя многоточие (...). Однако используемые данные находятся не в глобальной среде, а внутри списка. Минимальный пример:

L <-  list(data = chickwts, other = 1:5)

wrapper <-  function(list, formula = NULL, ...){
  if (missing(formula)) formula <-  formula(weight~feed)
  lm(formula, data = list$data, ...)
}

wrapper(L, subset = feed != "casein") #fails

Я могу заставить его работать, используя attach но я уверен, что есть более эффективные способы сделать это, указав рамки оценки...?

wrapper2 <-  function(list, formula = NULL, ...){
  if (missing(formula)) formula <-  formula(weight~feed)
  attach(list$data)
  m <- lm(formula, ...)
  detach(list$data)
  return(m)
}

wrapper2(L, subset = feed != "casein") #works

Другое решение, которое я использовал раньше, это использовать list(...)и иметь дело с аргументами вручную, но это не будет практичным в реальной ситуации.

Я вижу, что это довольно просто, но я не смог найти решение. Буду признателен за любые предложения по конкретной проблеме, а также ссылку на хорошее концептуальное объяснение среды в целом.

1 ответ

Решение

Нам нужно построить call а также eval Это.

wrapper <-  function(list, formula = NULL, ...){
  if (missing(formula)) formula <- weight ~ feed
  cl <- match.call()
  cl$list <- NULL
  cl$formula <- formula
  cl$data <- quote(list$data)
  cl[[1]] <- quote(stats::lm)
  eval(cl)
  }

Воспроизводимый пример:

L <- list(data = trees, other = 1:5)
wrapper(L, Height ~ Girth, subset = Volume > 20)
Другие вопросы по тегам