【问题标题】:Using Filter on the names of a named vector is returning an empty named vector, despite the predicate being true?尽管谓词为真,但对命名向量的名称使用过滤器会返回一个空的命名向量?
【发布时间】:2021-04-04 20:16:27
【问题描述】:

考虑out<-setNames(sample(26,replace = T),letters)。通过构造,输出的元素之一必须命名为a。但是,当我尝试Filter(function(x) names(x)=="a",out) 时,我得到一个大小为 0 的命名数字。为什么会发生这种情况?

【问题讨论】:

  • 最好提供letters的内容。字母是小写吗?
  • @JérômeRichard 是的。 letters 内置在我曾经使用过的每个 R 版本中。
  • 对不起,我错过了。
  • 这似乎是Filter 中的一个错误。

标签: r names


【解决方案1】:

函数Filter 丢失了向量的命名信息(因为它在out 内部使用了lapply,这也丢失了这些信息)。

但是,您可以使用out[names(out) == "a"] 过滤名称。 结果是一个包含6 名称为a 的向量。

【讨论】:

  • 你怎么知道lapply 是罪魁祸首? Filter 调用它,但我看不到 lapply 的这种行为记录在哪里。
  • 我刚刚跑了lapply(out, names),它返回了一个未命名向量的命名列表(列表本身是带有向量之一的名称)。问题是 names 调用不适用于列表名称,但适用于列表中未命名的向量,因此在 Rui Barradas 的帖子中描述了 NULL 值。所以,lapply 对我来说似乎很好,但在 Filter 中却没有使用。然而,只要命名是无证的,不幸的是很难说这种行为是否有意。
  • 你确定out的元素没有名字吗? example<-out[1] 肯定有预期的名称,而lapply(out,function(x) x+20) 之类的代码似乎不会删除预期的名称。似乎正在发生更深层次的事情。
  • 我尝试使用sapplyUSE.NAMES 参数。它与lapply 具有相同的行为。我希望它是适合这项工作的工具,但我错了。
【解决方案2】:

这似乎是Filter 中的一个错误。或者,至少是一种无证行为。函数参数x 不是命名整数,names 属性被剥离:

Filter(function(x) {
  print(names(x))
  names(x) == "a"
}, out)
#NULL
#NULL
#NULL
#NULL
# (... a total of 26 NULL's...)
#NULL
#NULL
#NULL
#NULL
#named integer(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2020-05-12
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多