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