5

我以编程方式评估了几个模型,它们的名称在 vector 中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没有成功。

4

3 回答 3

5

没有mget()

do.call(mtable, lapply(models, as.symbol))
于 2012-10-23T22:26:37.097 回答
3

使用do.call

do.call(mtable, mget(models,envir=globalenv()))
于 2012-10-23T22:23:49.973 回答
1

其他答案对我也有帮助,但焦点乔尔的特定例子掩盖了我通过实验发现的一般观点。是这样的:

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

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。)

于 2013-01-05T19:04:51.757 回答