【问题标题】:Why R is returning object when names are partially matching? [duplicate]为什么当名称部分匹配时 R 返回对象? [复制]
【发布时间】:2021-11-26 03:36:10
【问题描述】:

假设我有以下list

Dat = list('AAA' = 1:4, 'BBB' = 5:9)

现在我有以下语法

Dat$AA
## [1] 1 2 3 4

但是我的问题是为什么R 正在从Dat$AA 重新调整值,因为没有具有这样名称的元素? R 是否返回部分名称?

如果是这样,那么我认为这种行为是非常危险的,不应该被允许。

【问题讨论】:

    标签: r list


    【解决方案1】:

    根据?Extract

    [[ 和 $ 都选择列表的单个元素。主要区别在于 $ 不允许计算索引,而 [[ 允许。 x$name 等价于 x[["name", exact = FALSE]]。此外,[[ 的部分匹配行为可以使用精确参数来控制。

    还有,写在name

    name - 文字字符串或名称(可能是反引号)。对于提取,这通常(参见“环境”部分)与对象的名称部分匹配。

    用途在哪里

    x$名称


    由于exactFALSE,当我们使用$ 时,它允许部分匹配。这是使用[[ 的原因之一,其中exact = TRUE 的用法是

    x[[i, 精确 = TRUE]]

    ?Extract中也提到了如何更改options

    因此,默认行为是仅在通过 $ 从递归对象(环境除外)中提取时使用部分匹配。即使在这种情况下,也可以通过选项(warnPartialMatchDollar = TRUE)打开警告。

    【讨论】:

    • 非常感谢您提供这个非常有启发性的答案。
    • 有没有办法在全球范围内阻止这种行为?
    • 您可以使用options(warnPartialMatchDollar = TRUE)
    【解决方案2】:

    akrun 已经解释过这种行为已记录在案,但通常我们更希望不要发生这种情况。因此,我总是放入我的 .Rprofile 的一组行如下:

    options(
      warnPartialMatchArgs = TRUE,
      warnPartialMatchDollar = TRUE,
      warnPartialMatchAttr = TRUE
    )
    

    这将在 R 启动时运行,并在 R 中发生部分匹配时生成警告。如图所示,它发生在三个上下文中:在函数参数中、使用 $ 时和使用 attr() 时。我不认为你可以完全关闭部分匹配,但这应该在它发生时突出显示并防止随之而来的错误。

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2016-03-29
      • 2018-07-05
      相关资源
      最近更新 更多