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

时间:2015-09-24 13:27:45

标签: r list syntax

我注意到了这个意想不到的功能:

foo <- list(whatever=1:10)

现在,以下内容也适用:

foo$wha
foo$w
foo$whateve

但是,以下情况并非如此:

foo[["wha"]]

如果您有两个潜在的名称,例如“CXCL1”和“CXCL11”,则会产生意想不到的后果(对我来说意外),并且您想知道CXCL1是否不是通过检查!is.null(foo$CXCL1)为null,即使CXCL1为null,它也将返回TRUE,但CXCL11不是。

我的问题是:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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