R language definition(适用于3.5.1版)状态
表达式
x[]
返回x
,但从中删除“无关”属性 结果。仅names
和多维数组dim
和dimnames
属性会保留。
但是请考虑以下示例:
v <- factor(c(dog = 1, cat = 3))
attr(v, "label") <- "feeling confused"
attributes(v)
# $`names`
# [1] "dog" "cat"
#
# $levels
# [1] "1" "3"
#
# $class
# [1] "factor"
#
# $label
# [1] "feeling confused"
attributes(v[])
# $`names`
# [1] "dog" "cat"
#
# $levels
# [1] "1" "3"
#
# $label
# [1] "feeling confused"
#
# $class
# [1] "factor"
属性顺序已更改,但所有属性 均保留。
all.equal(attributes(v)[c(1,2,4,3)], attributes(v[]))
# [1] TRUE
为什么我的示例免税?还是我想念什么?
答案 0 :(得分:12)
我认为它可能只是在当前的R语言定义文档中被错误地记录了。
正如您所发现的,行为与所描述的相反。请注意,在您的示例中,如果使用v[1:length(v)]
进行了子集设置,则可以从v[]
获得预期的行为。因此,空[]
是一个返回不变属性的异常。
在寻找答案时,我发现了一个示例性的提交/评论(请参见此处的差异:https://github.com/wch/r-source/commit/6b3480e05e9671a517d70c80b9f3aac53b6afd9d#diff-3347e77b1c102d875a744a2cd7fa86e5)作者介绍了您观察到的行为:
子集(而不是空索引)通常会删除所有属性 @code {names},@ code {dim}和@code {dimnames}重置为 适当。另一方面,子分配通常会保留 属性,即使长度已更改。强制删除所有属性。
我认为,如果子集[]
为空,则返回的对象只是原始对象的副本。
编辑(来自下面的评论):
v
和v[]
的属性以不同顺序出现的原因可能是由于在这种特殊的带有空索引的子集情况下,属性分配给新子集的方式。此外,不应将不同的顺序视为错误,因为不应假定属性具有顺序(请参见help(attributes)
。请注意,在help(``[``)
中,您观察到的行为是准确描述的(与语言不同)您所引用的定义),并说明了为什么要这种行为:
一个空的索引会选择所有值:最常用于替换所有>条目,但保留“属性”。”