我以编程方式评估了几个模型,这些模型的名称位于向量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
,但没有成功。
答案 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
完全相同。)