【问题标题】:Indexing a list with an empty index用空索引索引列表
【发布时间】:2023-03-12 10:28:01
【问题描述】:

在 Hadley Wickam 的 Advanced R 中多次介绍了使用空索引对数据框进行索引的技术,但只是顺便解释了一遍。我正在尝试找出使用空索引对列表进行索引的规则。考虑以下四个陈述。

> (l <- list(a = 1, b = 2))
$a
[1] 1

$b
[1] 2

> (l[] <- list(c = 3))
$c
[1] 3

> l
$a
[1] 3

$b
[1] 3

> l[]
$a
[1] 3

$b
[1] 3

问题:

  1. 为什么第二个语句的输出与第三个语句的输出不同?分配不应该返回被分配的对象,在这种情况下,第二个语句应该产生与第三个相同的输出?
  2. 为什么第二个语句中的赋值导致第三个语句之后显示的输出?分配给空索引列表的规则是什么?
  3. 第四条语句为什么会产生显示的输出?当空索引不在赋值左侧时,使用空索引对列表进行索引的规则是什么?

【问题讨论】:

  • 这里需要一个数据框来说明我在书中使用这种技术的原因(以保留被分配对象的属性)。

标签: r list indexing


【解决方案1】:

简而言之,l[] 将返回整个列表。

(l <- list(a = 1, b = 2))
l[]

l[] &lt;- list(c=3) 本质上是将分配给每个索引的内容重新分配为现在list(c=3) 的结果。对于此示例,它与 l[[1]] &lt;- 3l[[2]] &lt;- 3 相同。来自?'[' 页面,其中多次提到空索引:

当索引表达式出现在赋值(称为子赋值)的左侧时,x 的该部分将设置为赋值右侧的值。

还有

空索引选择所有值:这最常用于替换所有条目但保留属性。

所以,我粗略地认为这意味着l 的每个索引都应该评估为list(c=3)

当您输入(l[] &lt;- list(c = 3)) 时,返回的是替换值。然后当您输入ll[] 时,您将看到每个索引处的值已被list(c=3) 替换。

【讨论】:

    【解决方案2】:

    除了上一个答案,看看这个。请注意,其行为与普通向量和列表完全相同,因此不能标记为“特定于列表”。

    v <- 1:3
    names(v) <- c("one", "two", "three")
    r <- 4:5
    names(r) <- c("four", "five")
    (v[] <- r)
    
      four  five 
         4     5 
    Warning message:
    In v[] <- r :
      number of items to replace is not a multiple of replacement length
    
    v
    
      one   two three 
        4     5     4
    

    通过子集分配保留初始属性(此处为名称)。因此,分配右侧的名称会丢失。同样重要的是,通过子集分配遵循回收规则。在您的示例中,所有值都重新分配为 3,在我的示例中,由于长度不兼容,部分回收带有警告。

    总结一下,

    1. 在应用回收规则之前评估右侧的&lt;- 退货分配。
    2. 这是由于回收,因为两个对象的长度不同。
    3. 没有赋值运算符,lvl[]v[] 基本相同。

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      相关资源
      最近更新 更多