使用"$"功能进行补偿

Fra*_*ank 8 r lapply

我在hadley的功能指南中经历了一些例子,并遇到了意想不到的问题.

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

x=1:3;y=3:1; bah <- list(lm(x~y),lm(y~x))
Run Code Online (Sandbox Code Playgroud)

并希望从每个中提取一些东西(如hadley关于名为"试验"的列表的问题所示).我期待其中一个工作:

lapply(bah,`$`,i='call') # or...
lapply(bah,`$`,call)
Run Code Online (Sandbox Code Playgroud)

但是,这些返回null.好像我没有滥用这个$功能,因为这些东西有效:

`$`(bah[[1]],i='call')
`$`(bah[[1]],call)
Run Code Online (Sandbox Code Playgroud)

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

我才意识到这有效:

lapply(bah,`[[`,i='call')
Run Code Online (Sandbox Code Playgroud)

还有这个

lapply(bah,function(x)`$`(x,call))
Run Code Online (Sandbox Code Playgroud)

也许这只是归结为一些lapply需要匿名功能而不需要任何功能的伏都教?我觉得我以前在某个地方听说过.

Jos*_*ich 5

记录在?lapply“注意”部分(重点是我的)中:

由于历史原因,创建的调用lapply未被评估,并且已经编写bquote了依赖于此的代码(例如)。这意味着记录的呼叫始终为形式FUN(X[[0L]], ...)0L并被当前的整数索引取代。这通常不是问题,但是如果FUN使用sys.callmatch.call如果它是使用该调用的原始函数,则可能是问题。 这意味着用包装器调用原始函数通常更安全,因此lapply(ll, function(x) is.numeric(x)) R 2.7.1中要求使用例如以确保is.numeric 正确进行方法分配。

  • `\`$ \`(bah [[1L]],...)` (4认同)