在R输入语言定义(版本为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
为什么我的例子免除?或者我错过了什么?
E. *_*own 12
我认为在当前的R语言定义文档中可能只是错误地记录了它.
正如您所发现的,行为与所描述的相反.请注意,在您的示例中,如果使用子集v[1:length(v)],则可以获得预期的行为v[].所以empty []是异常,它返回不变的属性.
寻找答案我找到了一个说明性的提交/评论(请参阅差异:https://github.com/wch/r-source/commit/6b3480e05e9671a517d70c80b9f3aac53b6afd9d#diff-3347e77b1c102d875a744a2cd7fa86e5)作者描述了您观察到的行为:
子集(除了空索引之外)通常会丢弃除@code {names},@ code {dim}和@code {dimnames}之外的所有属性,这些属性将根据需要进行重置.另一方面,即使长度发生变化,子分配通常也会保留属性.强制降低了所有属性.
我认为如果子集[]为空,则返回的对象只是原始对象的副本.
编辑(来自下面的评论):
由于在使用空索引进行子集化的特殊情况下将属性分配给新子集的方式,因此属性v和v[]以不同顺序出现的原因可能是由于属性被分配给新子集的方式.此外,不应将不同的顺序视为错误,因为属性不应该有顺序(请参阅help(attributes).请注意,help(``[``)您所观察到的行为是准确描述的(与您引用的语言定义不同),并解释了为什么会这样做想要这个行为:
空索引选择所有值:这通常用于替换所有>条目,但保留'属性'."