【问题标题】:Applying empty brackets in R drops attributes? (reading the R language definition)在 R 中应用空括号会删除属性? (阅读 R 语言定义)
【发布时间】:2018-12-19 17:11:59
【问题描述】:

R language definition(适用于版本 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"

属性顺序已更改,但所有属性都保留

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

为什么我的示例可以豁免?或者我错过了什么?

【问题讨论】:

  • 您能否提供一个反例,其中删除了“不相关的属性”?
  • @Mako212 不,实际上我不能。但没有搜索太多。
  • 我也不确定那个例子是什么,但我认为我们不能认为v 的属性无关紧要。也许这与 S3/S4 类属性有关?
  • 一些与思考有关的东西:stackoverflow.com/q/41191623/324364
  • stat.ethz.ch/pipermail/r-help/2015-December/434647.html 中发现了一些相关的东西,它表明R 语言定义存在。

标签: r


【解决方案1】:

我认为它可能只是在当前的 R 语言定义文档中被错误记录。

如您所见,该行为与所描述的相反。请注意,在您的示例中,如果您使用 v[1:length(v)] 进行子集化,您将获得来自 v[] 的预期行为。所以空的[]是返回属性不变的异常。

寻找答案我发现了一个说明性的提交/评论(请参阅此处的差异:https://github.com/wch/r-source/commit/6b3480e05e9671a517d70c80b9f3aac53b6afd9d#diff-3347e77b1c102d875a744a2cd7fa86e5)作者描述了您观察到的行为:

子集(除了空索引)通常会删除所有属性 除了@code{names}、@code{dim} 和 @code{dimnames},它们被重置为 合适的。另一方面,子赋值通常保留 即使长度改变了属性。强制删除所有属性。

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

编辑(来自下面的 cmets):

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

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

【讨论】:

  • v[1:length(v)] 保留类和级别属性。我的例子表明它不仅仅是一个副本,因为属性顺序发生了变化。
  • 我认为这可能是因为在这种特殊情况下,属性被分配给新子集的方式为空索引。此外,它不应被视为错误,因为属性不应该有顺序(请参阅help(attributes)。请注意,在help(``[``) 中,您观察到的行为得到了准确的描述,并解释了为什么人们会想要这种行为。 “空索引选择所有值:这最常用于替换所有条目但保留'属性'。”
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2013-11-09
  • 2021-10-05
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多