在R中应用空括号会删除属性吗?(阅读R语言定义)

在R中应用空括号会删除属性吗?(阅读R语言定义),r,R,(对于版本3.5.1)说明 表达式x[]返回x,但从 结果呢。只有名称和多维数组dim和 dimnames属性将保留 all.equal(attributes(v)[c(1,2,4,3)], attributes(v[])) # [1] TRUE 但请考虑下面的例子: v <- factor(c(dog = 1, cat = 3)) attr(v, "label") <- "feeling confused" attributes(v) # $`names` # [1] "dog"

(对于版本3.5.1)说明

表达式
x[]
返回
x
,但从 结果呢。只有
名称
和多维数组
dim
dimnames
属性将保留

all.equal(attributes(v)[c(1,2,4,3)], attributes(v[]))
# [1] TRUE

但请考虑下面的例子:

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"

为什么我的例子是免税的?或者我遗漏了什么?

我认为这可能只是当前R语言定义文档中的错误文档

正如您所发现的,这种行为与所描述的相反。请注意,在您的示例中,如果您使用
v[1:length(v)]
进行子集划分,您将从
v[]
中获得预期的行为。因此,空的
[]
是返回属性不变的异常

在寻找答案时,我发现了一个说明性的提交/评论(请参见此处的差异:),作者描述了您观察到的行为:

子集(不是通过空索引)通常会删除所有属性 除了@code{names}、@code{dim}和@code{dimnames}被重置为 适当的另一方面,次分配通常保留 属性,即使长度已更改。强制删除所有属性

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

编辑(来自以下评论):

v
v[]
的属性以不同的顺序出现的原因很可能是因为在使用空索引进行子集设置的特殊情况下,属性分配给新子集的方式。此外,不同的顺序不应被视为错误,因为属性不应该有顺序(请参见
help(attributes)
。请注意,在
help(`[``)
中,您观察到的行为得到了准确描述(与您引用的语言定义不同),并解释了为什么需要这种行为:

空索引选择所有值:这通常用于替换所有>项,但保留“属性”


您能否提供一个反例,说明“不相关的属性”"不知道,但实际上我不能。但是我没有找到很多。我不知道这个例子是什么,但是我认为我们不能考虑<代码> v<代码>的属性。这可能与S3/S4类属性有关。一些与思考有关的东西:找到了相关的东西,它声明了R语言DEF。起始点位于。
v[1:长度(v)]
保留了class和levels属性。我的示例表明,它不仅仅是一个副本,因为属性顺序发生了变化。我认为这可能是因为在使用空索引进行子集设置的特殊情况下,属性分配给新子集的方式。此外,不应将其视为错误,因为属性不是su假定有一个顺序(请参见
帮助(属性)
。请注意,在
帮助(`[``)
)中,您观察到的行为被准确地描述,并解释了为什么需要这种行为。“空索引选择所有值:这通常用于替换所有条目,但保留“属性”。”