【问题标题】:How can I use list/vector elements as objects arguments to a function in R?如何使用列表/向量元素作为 R 中函数的对象参数?
【发布时间】:2012-10-13 23:04:18
【问题描述】:

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

【问题讨论】:

    标签: r call expression eval


    【解决方案1】:

    没有mget()

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

    【讨论】:

      【解决方案2】:

      使用do.call:

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

      【讨论】:

      • 谢谢,这行得通!我尝试了与 do.call 不同的组合,但显然不是这个非常简单的组合...... ashamed
      【解决方案3】:

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

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

      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 做的事情基本相同。)

      【讨论】:

      • 我想你想要fvar(myargs[[1]], myargs[[2]]),甚至fvar(a=myvar[[1]], b=myvar[[2]])
      • (意识到我试图添加的评论不相关,但无法完全删除。)
      • 也许在某些情况下 myargs[1] 是合适的,但你是对的。我会编辑答案。
      猜你喜欢
      • 1970-01-01
      • 2013-12-12
      • 2020-04-18
      • 2017-09-24
      • 2017-04-09
      • 2013-10-13
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多