在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
问题:
答案 0 :(得分:2)
简而言之l[]
将返回整个列表。
(l <- list(a = 1, b = 2))
l[]
l[] <- list(c=3)
基本上是重新分配分配给每个索引的内容,现在是list(c=3)
的结果。对于此示例,它与说l[[1]] <- 3
和l[[2]] <- 3
相同。在?'['
页面中,提到了几次空索引:
当索引表达式出现在赋值的左侧(称为子分配)时,x的该部分将设置为赋值右侧的值。
以及
空索引选择所有值:这通常用于替换所有条目但保留属性。
因此,我粗略地认为这意味着l
的每个索引应该评估为list(c=3)
。
当您输入(l[] <- list(c = 3))
时,返回的是替换值。然后,当您输入l
或l[]
时,您会看到每个索引的值已被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,在我的示例中,由于长度不兼容,存在部分回收和警告。
总结一下,
<-
的作业返回评估右侧之前应用回收规则。l
或v
与l[]
或v[]
基本相同。