使用“$”功能进行补偿

时间:2013-08-13 18:02:29

标签: r lapply

我在hadley的功能指南中经历了some examples,并遇到了意想不到的问题。

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

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

并且希望从每个中提取一些东西(正如hadley关于名为&#34的试验的问题所提出的那样;试验&#34;)。我期待其中一个工作:

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

但是,这些返回null。我似乎没有滥用$函数,因为这些工作正常:

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

无论如何,我只是把它作为一种练习而且好奇我的错误。我知道我可以使用匿名函数,但认为必须有一种方法来使用类似于我最初的非解决方案的语法。我已查看了$中提到的地点?Extract,但没有看到任何明显的解释。

我刚才意识到这有效:

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

和这个

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

也许这只是归结为一些需要匿名函数的lapply伏都教而不应该需要它们?我觉得我以前在某个地方听说过。

1 个答案:

答案 0 :(得分:4)

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

  

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