R:为什么使用]比使用$更快?

我一直在研究一些需要我做大量列表子集的项目,而在分析代码的时候,我意识到对列表进行子集化的对象[[nameHere]]方法通常比对象$ nameHere方法快。

作为一个例子,如果我们用命名组件创build一个列表:

a.long.list <- as.list(rep(1:1000)) names(a.long.list) <- paste0("something",1:1000) 

为什么是这样:

 system.time ( for (i in 1:10000) { a.long.list[["something997"]] } ) user system elapsed 0.15 0.00 0.16 

比这更快:

 system.time ( for (i in 1:10000) { a.long.list$something997 } ) user system elapsed 0.23 0.00 0.23 

我的问题是,这种行为是否真的是普遍的,我应该尽可能地避免$子集,或者最有效的select取决于其他因素?

函数[[首先遍历所有元素,尝试精确匹配, 然后尝试做部分匹配。 $函数依次尝试精确匹配和部分匹配。 如果您执行:

 system.time ( for (i in 1:10000) { a.long.list[["something9973", exact=FALSE]] } ) 

也就是说,如果没有完全匹配的情况下进行部分匹配,则会发现$实际上速度稍快一些。