我注意到了这个意想不到的功能:
foo <- list(whatever=1:10)
现在,以下内容也有效:
foo$wha
foo$w
foo$whateve
但是,以下情况则不然:
foo[["wha"]]
这会产生意想不到的后果(对我来说是意想不到的),如果您有两个潜在的名称,例如“CXCL1 ”和“CXCL11 ”,并且您想通过检查 !is 来了解 CXCL1 是否不为空.null(foo$CXCL1)
,即使CXCL1为空,它也会返回TRUE,但CXCL11不是。
我的问题是:
- 这是如何运作的?
foo$whatever
和foo[["whatever"]]
有什么区别?- 为什么有人想要这种行为?我该如何禁用它?
最佳答案
部分匹配仅适用于列表名称的唯一初始子序列。因此,例如:
> l <- list(score=1, scotch=2) > l$core #only INITIAL subsequences NULL > l$sco #only UNIQUE subsequences NULL > l$scor [1] 1
[[
和$
都选择列表中的单个元素。主要区别是$
不允许计算索引,而[[
允许,并且默认情况下允许使用运算符$
进行部分匹配,但是不与[[
.这些提取或替换运算符来自S,尽管R限制了部分匹配的使用,而S默认在大多数运算符中使用部分匹配。
在您的示例中,如果 CXCL1
和 CXCL11
共存并且您索引 foo$CXCL1
,则这不是部分匹配,应返回 CXCL1
的值。如果没有,也许还有其他问题。
我应该指出,[[
从R 2.7.0
版本开始默认不允许部分匹配。
关于R 列表——如何处理元素名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762633/