使用空索引索引列表

时间:2013-12-30 08:47:00

标签: r list indexing

在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. 第四个陈述怎么产生显示的输出?当一个列表不在作业的左侧时,有哪些规则可以为具有空索引的列表编制索引?

2 个答案:

答案 0 :(得分:2)

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

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

l[] <- list(c=3)基本上是重新分配分配给每个索引的内容,现在是list(c=3)的结果。对于此示例,它与说l[[1]] <- 3l[[2]] <- 3相同。在?'['页面中,提到了几次空索引:

  

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

以及

  

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

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

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

答案 1 :(得分: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. 使用<-的作业返回评估右侧之前应用回收规则。
  2. 这是因为回收,因为两个对象的长度不同。
  3. 如果没有赋值运算符,lvl[]v[]基本相同。