【问题标题】:R Language Definition: indexing a named vector using dollar signR语言定义:使用美元符号索引命名向量
【发布时间】:2021-07-25 06:54:14
【问题描述】:

可以通过以下方式使用字符来索引命名向量:

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

我正在阅读 R 语言定义§ 3.4.1 Indexing by vectors,这似乎是说美元符号 ($) 可用于访问命名向量的内容:

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

[...]

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

所以我尝试通过以下方式使用$

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

但是,我收到一个错误:

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

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

【问题讨论】:

  • 可以使用$ 索引列表v &lt;- list(a=9, b=8, c=7)。无法使用$ 符号对向量进行索引。
  • @RonakShah 如果是这样,那为什么正文会说“我们将首先讨论简单向量的索引”?
  • 该部分的主旨是讨论 x[i] 的用法,在这里随便提到 $ 有点奇怪。 $ 描述的行为适用于 $ 的行为,这不适用于原子向量(通常由 c() 构造(有关详细信息,请参见 ?is.atomic)并在您的错误消息中提到)。所描述的行为将适用于列表,我相信环境,例如
  • 该部分的重点是索引 by 向量。没有提到我们正在索引向量、列表或其他任何东西。
  • @RonakShah 但在x$aa aa 是一个名称,而不是一个向量。所以引用确实不合适。

标签: r


【解决方案1】:

3.4 indexing 部分的介绍部分, 其第一小节是您提到的段落(3.4.1 Indexing by vectors),指定为:

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

将 $ 应用于非递归对象是错误的。”

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

您可以使用函数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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2013-02-07
    • 2021-04-25
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多