我注意到了这个意想不到的功能:
foo <- list(whatever=1:10)
现在,以下内容也适用:
foo$wha
foo$w
foo$whateve
但是,以下情况并非如此:
foo[["wha"]]
如果您有两个潜在的名称,例如“CXCL1”和“CXCL11”,则会产生意想不到的后果(对我来说意外),并且您想知道CXCL1是否不是通过检查!is.null(foo$CXCL1)
为null,即使CXCL1为null,它也将返回TRUE,但CXCL11不是。
我的问题是:
foo$whatever
和foo[["whatever"]]
之间的区别是什么?答案 0 :(得分:1)
部分匹配仅适用于列表名称的唯一初始子序列。所以,例如:
> l <- list(score=1, scotch=2)
> l$core #only INITIAL subsequences
NULL
> l$sco #only UNIQUE subsequences
NULL
> l$scor
[1] 1
[[
和$
都会选择列表中的单个元素。主要区别在于$
不允许计算索引,而[[
则允许,默认情况下允许部分匹配运算符$
但不允许使用[[
。
这些 Extract或Replacement 运算符来自S,虽然R限制使用部分匹配,而S默认情况下在大多数运算符中使用部分匹配。
在您的示例中,如果CXCL1
和CXCL11
共存且您为foo$CXCL1
编制索引,那么这不是部分匹配,应该返回CXCL1
的值。如果没有,也许还有另一个问题。
我应该指出,[[
不允许部分匹配作为默认值从版本R 2.7.0
开始。