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

foo <- list(whatever=1:10)

现在,以下内容也适用:
foo$wha
foo$w
foo$whateve

但是,以下内容不是:
foo[["wha"]]

这会带来意想不到的结果(对我来说是意外的),如果您有两个可能的名称,例如“CXCL1”和“CXCL11”,并且您想通过检查!is.null(foo$CXCL1)来了解CXCL1是否不为null,即使CXCL1为空,但CXCL11不是。

我的问题是:
  • 它是如何工作的?
  • foo$whateverfoo[["whatever"]]有什么区别?
  • 为什么有人会想要这种行为,以及如何禁用它呢?
  • 最佳答案

  • 部分匹配仅适用于列表名称的唯一初始子序列。因此,例如:
    > l <- list(score=1, scotch=2)
    > l$core #only INITIAL subsequences
    NULL
    > l$sco #only UNIQUE subsequences
    NULL
    > l$scor
    [1] 1
    
  • [[$都选择列表中的单个元素。主要区别在于$不允许计算索引,而[[允许,并且默认情况下允许部分匹配与oper $一起使用,但不允许与[[一起使用。
  • 这些提取或替换运算符来自S,尽管R限制使用部分匹配,而默认情况下,S在大多数运算符中使用部分匹配。

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

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

    09-13 12:01