使用“$”功能
我正在通过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巫术, lapply需要这些功能? 我觉得我以前听说过这个地方。
这是记录在?lapply ,在“注”部分(重点我的):
由于历史原因,由lapply创建的调用lapply ,并且编写了代码(例如bquote ),依赖于此。 这意味着记录的调用始终是FUN(X[[0L]], ...) ,其中0L由当前整数索引替换。 这通常不是问题,但如果FUN使用sys.call或match.call或者它是一个使用该调用的原始函数,则可能是这样。 这意味着使用包装器调用原始函数通常更安全,因此在R 2.7.1中需要lapply(ll, function(x) is.numeric(x))以确保发生is.numeric方法分派正确。
