使用“$”功能
我正在通过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
方法分派正确。