Как использовать элементы списка/вектора в качестве аргументов объектов функции в R?

Я программно оценил несколько моделей, имена которых находятся в векторе models. Как я могу использовать функцию mtable с ними, вызывая их программно?

Вот пример:

library(memisc)
a <- rnorm(100,0,1)
b <- rnorm(100,0,1)
c <- rnorm(100,0,1)
d <- rnorm(100,0,1)
mod1 <- lm(a ~ b)
mod2 <- lm(c ~ d)
models <- c("mod1", "mod2")
mtable(mget(models,envir=globalenv()))

Затем я получаю сообщение об ошибке: "no method available for 'getSummary' for an object of class 'list'".

Что я могу сделать? Я пробовал call и do.call, но безуспешно.

3 ответа

Использование do.call:

do.call(mtable, mget(models,envir=globalenv()))


Без mget():

do.call(mtable, lapply(models, as.symbol))


Эти ответы были полезны и для меня, но основной пример Джоэла скрыл общий момент, который я понял из эксперимента. Это:

Для функции, которая принимает переменное количество аргументов:

fvar <- function(...) {do something}

предположим, что аргументы, которые вы хотите передать, уже содержатся в списке:

myargs <- list(a=1:3, b=c(2, 3, 4))

Вы можете передавать их отдельно, например:

fvar(myargs[[1]], myargs[[2]])

но это работает только в том случае, если ваш код знает структуру списка.

do.call() позволяет передавать все, что есть в вашем списке, в виде серии аргументов функции:

do.call(fvar, myargs)

Это более общее, так как ваш код не должен определять, что такое конкретная структура списка, если вы можете предположить, что он подходит для этой функции.

(do.call делает по существу то же самое, что и Common Lisp apply).

licensed under cc by-sa 3.0 with attribution.