如何使用list / vector元素作为R中函数的对象参数?

时间:2012-10-23 22:18:23

标签: r call expression eval

我以编程方式评估了几个模型,这些模型的名称位于向量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'"

我该怎么办?我尝试了calldo.call,但没有成功。

3 个答案:

答案 0 :(得分:5)

没有mget()

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

答案 1 :(得分:3)

使用do.call

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

答案 2 :(得分:0)

这些答案对我来说也很有帮助,但焦点乔尔的特殊例子掩盖了我通过实验得出的一般观点。就是这样:

给定一个接受可变数量参数的函数:

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完全相同。)