字符可用于下列方式索引命名向量:
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