R列表 - 如何处理元素名称?

Jan*_*ary 11 syntax r list

我注意到了这个意外的功能:

foo <- list(whatever=1:10)
Run Code Online (Sandbox Code Playgroud)

现在,以下工作原理:

foo$wha
foo$w
foo$whateve
Run Code Online (Sandbox Code Playgroud)

但是,以下内容不是:

foo[["wha"]]
Run Code Online (Sandbox Code Playgroud)

这会产生意想不到的后果(对我而言是意料之外的),如果您有两个潜在的名称,例如" CXCL1 "和" CXCL11 ",并且您想通过检查知道CXCL1是否为空!is.null(foo$CXCL1),则即使CXCL1也会返回TRUE null,但CXCL11不是.

我的问题是:

  1. 这是如何运作的?
  2. foo$whatever和之间有什么区别foo[["whatever"]]
  3. 为什么有人想要这种行为以及如何禁用它?

mes*_*rra 1

  1. 部分匹配仅适用于列表名称的唯一初始子序列。因此,例如:

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

  3. 这些Extract 或 Replacement运算符来自 S,尽管 R 限制了部分匹配的使用,而 S 在大多数运算符中默认使用部分匹配。

在您的示例中,如果CXCL1CXCL11共存并且您索引foo$CXCL1,那么这不是部分匹配,应该返回CXCL1的值。如果没有,也许还有另一个问题。

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