我在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
伏都教而不应该需要它们?我觉得我以前在某个地方听说过。
答案 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
的方法调度 正确发生。