我在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需要匿名功能而不需要任何功能的伏都教?我觉得我以前在某个地方听说过.
记录在?lapply“注意”部分(重点是我的)中:
由于历史原因,创建的调用
lapply未被评估,并且已经编写bquote了依赖于此的代码(例如)。这意味着记录的呼叫始终为形式FUN(X[[0L]], ...),0L并被当前的整数索引取代。这通常不是问题,但是如果FUN使用sys.call或match.call或如果它是使用该调用的原始函数,则可能是问题。 这意味着用包装器调用原始函数通常更安全,因此lapply(ll, function(x) is.numeric(x))R 2.7.1中要求使用例如以确保is.numeric正确进行方法分配。