在R drops属性中应用空括号?(阅读R语言定义)

sin*_*dur 16 r

R输入语言定义(版本为3.5.1)状态

表达式x[]返回x,但从结果中删除"不相关"的属性.仅保留names多维数组dimdimnames属性.

但请考虑以下示例:

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"
Run Code Online (Sandbox Code Playgroud)

属性顺序被改变,但所有属性保留.

all.equal(attributes(v)[c(1,2,4,3)], attributes(v[]))
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

为什么我的例子免除?或者我错过了什么?

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}之外的所有属性,这些属性将根据需要进行重置.另一方面,即使长度发生变化,子分配通常也会保留属性.强制降低了所有属性.

我认为如果子集[]为空,则返回的对象只是原始对象的副本.

编辑(来自下面的评论):

由于在使用空索引进行子集化的特殊情况下将属性分配给新子集的方式,因此属性vv[]以不同顺序出现的原因可能是由于属性被分配给新子集的方式.此外,不应将不同的顺序视为错误,因为属性不应该有顺序(请参阅help(attributes).请注意,help(``[``)您所观察到的行为是准确描述的(与您引用的语言定义不同),并解释了为什么会这样做想要这个行为:

空索引选择所有值:这通常用于替换所有>条目,但保留'属性'."

  • 我认为这可能是因为在使用空索引进行子集化的特殊情况下将属性分配给新子集的方式.此外,它不应该被认为是一个错误,因为属性不应该有一个顺序(参见`help(attributes)`.注意在`help(````````中,你观察到的行为被准确描述,并解释了为什么人们会想要这种行为."空索引选择所有值:这通常用于替换所有条目,但保留'属性'." (6认同)