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 不是。

我的问题是:

  1. 这是如何运作的?
  2. foo$whateverfoo[["whatever"]]有什么区别?
  3. 为什么会有人想要这种行为,我该如何禁用它?
  1. 部分匹配仅适用于列表名称的唯一初始子序列。因此,例如:

    > l <- list(score=1, scotch=2)
    > l$core #only INITIAL subsequences
    NULL
    > l$sco #only UNIQUE subsequences
    NULL
    > l$scor
    [1] 1
    
  2. [[$ select 都是列表的单个元素。主要区别在于 $ 不允许计算索引,而 [[ 允许,并且默认情况下允许使用运算符 $ 进行部分匹配,但不使用 [[.

  3. 这些Extract or Replacement运算符来自S,虽然R限制使用部分匹配,而S在大多数运算符中默认使用部分匹配。

在您的示例中,如果 CXCL1CXCL11 共存并且您索引 foo$CXCL1,那不是部分匹配并且应该 return CXCL1's价值。如果没有,可能还有其他问题。

我应该指出,[[ 从版本 R 2.7.0 开始默认不允许部分匹配。