R 列表——如何处理元素名称?
R lists -- how are element names handled?
我注意到这个意外的特点:
foo <- list(whatever=1:10)
现在,以下内容也有效:
foo$wha
foo$w
foo$whateve
但是,以下情况不会:
foo[["wha"]]
如果你有两个可能的名字,比如“CXCL1" and "CXCL11”,并且你想通过检查 [=13 来知道 CXCL1 是否不为空,这会产生意想不到的后果(对我来说是意想不到的) =],即使 CXCL1 为空,它也会 return 为真,但 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
[[
和 $
select 都是列表的单个元素。主要区别在于 $
不允许计算索引,而 [[
允许,并且默认情况下允许使用运算符 $
进行部分匹配,但不使用 [[
.
这些Extract or Replacement运算符来自S,虽然R限制使用部分匹配,而S在大多数运算符中默认使用部分匹配。
在您的示例中,如果 CXCL1
和 CXCL11
共存并且您索引 foo$CXCL1
,那不是部分匹配并且应该 return CXCL1
's价值。如果没有,可能还有其他问题。
我应该指出,[[
从版本 R 2.7.0
开始默认不允许部分匹配。
我注意到这个意外的特点:
foo <- list(whatever=1:10)
现在,以下内容也有效:
foo$wha
foo$w
foo$whateve
但是,以下情况不会:
foo[["wha"]]
如果你有两个可能的名字,比如“CXCL1" and "CXCL11”,并且你想通过检查 [=13 来知道 CXCL1 是否不为空,这会产生意想不到的后果(对我来说是意想不到的) =],即使 CXCL1 为空,它也会 return 为真,但 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
[[
和$
select 都是列表的单个元素。主要区别在于$
不允许计算索引,而[[
允许,并且默认情况下允许使用运算符$
进行部分匹配,但不使用[[
.这些Extract or Replacement运算符来自S,虽然R限制使用部分匹配,而S在大多数运算符中默认使用部分匹配。
在您的示例中,如果 CXCL1
和 CXCL11
共存并且您索引 foo$CXCL1
,那不是部分匹配并且应该 return CXCL1
's价值。如果没有,可能还有其他问题。
我应该指出,[[
从版本 R 2.7.0
开始默认不允许部分匹配。