8

我正在浏览hadley 的函数指南中的一些示例,并遇到了一个意想不到的问题。

假设我有一个模型对象列表,

x=1:3;y=3:1; bah <- list(lm(x~y),lm(y~x))

并希望从中提取一些东西(正如哈德利关于名为“试验”的列表的问题中所建议的那样)。我期待其中一个工作:

lapply(bah,`$`,i='call') # or...
lapply(bah,`$`,call)

但是,这些返回空值。似乎我没有滥用该$功能,因为这些东西有效:

`$`(bah[[1]],i='call')
`$`(bah[[1]],call)

无论如何,我只是将其作为一种练习,并且很好奇我的错误在哪里。我知道我可以使用匿名函数,但认为必须有一种方法可以使用类似于我最初的非解决方案的语法。我浏览了$中提到的地方?Extract,但没有看到任何明显的解释。

我刚刚意识到这有效:

lapply(bah,`[[`,i='call')

和这个

lapply(bah,function(x)`$`(x,call))

也许这只是归结为一些lapply需要匿名函数的巫术,而这些函数不需要匿名函数?我觉得我以前在 SO 的某个地方听说过。

4

1 回答 1

5

这记录在?lapply“注释”部分(强调我的)中:

由于历史原因,由创建的调用lapply未被评估,并且已经编写bquote了依赖于此的代码(例如)。这意味着录制的通话始终为 形式FUN(X[[0L]], ...)0L替换为当前整数索引。这通常不是问题,但它可能是如果FUN使用,或者sys.call如果 它是使用调用的原始函数。 这意味着使用包装器调用原始函数通常更安全,因此例如 在 R 2.7.1 中需要确保方法分派 正确发生。match.calllapply(ll, function(x) is.numeric(x))is.numeric

于 2013-08-13T19:20:21.347 回答