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

标签 r list syntax

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

foo <- list(whatever=1:10)

现在,以下内容也有效:

foo$wha
foo$w
foo$whateve

但是,以下情况则不然:

foo[["wha"]]

这会产生意想不到的后果(对我来说是意想不到的),如果您有两个潜在的名称,例如“CXCL1 ”和“CXCL11 ”,并且您想通过检查 !is 来了解 CXCL1 是否不为空.nu​​ll(foo$CXCL1),即使CXCL1为空,它也会返回TRUE,但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. [[$ 都选择列表中的单个元素。主要区别是 $ 不允许计算索引,而 [[ 允许,并且默认情况下允许使用运算符 $ 进行部分匹配,但是不与 [[.

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

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

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

关于R 列表——如何处理元素名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762633/

相关文章:

memory - 确定对象的内存使用情况?

r - 使用 ggplot2 编写一个简单的函数

r - 使用传递参数从 python 代码调用 R 函数

list - 如何使用 flutter 在 listTile 中创建控件

SQL:正确的连接语法

c - C 语言中 i = i&1 是什么意思?

r - 在 R markdown 中折叠/隐藏数字

java - 我想通过多线程将此函数作为列表中所有值的线程执行,请指导我

python - 列表中的字符串数据到python中的数值|不可散列类型 : 'list'

syntax - 首选声明/初始化方法