R语言定义:使用美元符号索引命名向量



字符可用于下列方式索引命名向量:

v <- c(a=9, b=8, c=7)
v[["a"]]  # Returns: 9

我正在阅读R语言定义,§3.4.1通过向量索引,这似乎说美元符号($)可以用来访问命名向量的内容:

R允许使用向量作为索引进行一些强大的构造。我们首先讨论简单向量的标度。为简单起见,假设表达式为x[i]。则根据i的类型,存在以下可能性:

[…]

  • 字符。i中的字符串与x的names属性进行匹配,并使用结果的整数。对于[[$,如果精确匹配失败,则使用部分匹配,因此,如果x不包含名为"aa"的组件并且"aabb"是唯一具有前缀"aa"的名称,则x$aa将匹配x$aabb。[…]

所以我尝试用以下方式使用$:

v <- c(a=9, b=8, c=7)
v$a

但是,我得到一个错误:

Error in v$a : $ operator is invalid for atomic vectors

这是什么意思?我一定是误解了上面R语言定义的摘录。

在3.4节索引的介绍部分,它的第一个小节是你提到的段落(3.4.1按向量索引),指定为:

使用$的形式适用于递归对象,如列表和对列表。它只允许一个字面值字符串或一个符号作为索引。

对非递归对象应用$是错误的。">

在您的示例中,您正在使用$索引非递归对象。因为被索引的向量不是递归的,所以你会得到一个错误。

你可以使用函数is.recursive来测试一个对象是否是递归的。注意,环境对象也是递归的。

v <- c(a=9, b=8, c=7)
x <- list(a=8, b=3)
y <- pairlist(a=5)
e <- as.environment(x)
is.recursive(v)
# [1] FALSE
is.recursive(x)
# [1] TRUE
is.recursive(y)
# [1] TRUE
is.recursive(e)
# [1] TRUE

最新更新