【发布时间】: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 是否返回部分名称?
如果是这样,那么我认为这种行为是非常危险的,不应该被允许。
【问题讨论】:
假设我有以下list
Dat = list('AAA' = 1:4, 'BBB' = 5:9)
现在我有以下语法
Dat$AA
## [1] 1 2 3 4
但是我的问题是为什么R 正在从Dat$AA 重新调整值,因为没有具有这样名称的元素? R 是否返回部分名称?
如果是这样,那么我认为这种行为是非常危险的,不应该被允许。
【问题讨论】:
根据?Extract
[[ 和 $ 都选择列表的单个元素。主要区别在于 $ 不允许计算索引,而 [[ 允许。 x$name 等价于 x[["name", exact = FALSE]]。此外,[[ 的部分匹配行为可以使用精确参数来控制。
还有,写在name下
name - 文字字符串或名称(可能是反引号)。对于提取,这通常(参见“环境”部分)与对象的名称部分匹配。
用途在哪里
x$名称
由于exact 是FALSE,当我们使用$ 时,它允许部分匹配。这是使用[[ 的原因之一,其中exact = TRUE 的用法是
x[[i, 精确 = TRUE]]
?Extract中也提到了如何更改options
因此,默认行为是仅在通过 $ 从递归对象(环境除外)中提取时使用部分匹配。即使在这种情况下,也可以通过选项(warnPartialMatchDollar = TRUE)打开警告。
【讨论】:
options(warnPartialMatchDollar = TRUE)
akrun 已经解释过这种行为已记录在案,但通常我们更希望不要发生这种情况。因此,我总是放入我的 .Rprofile 的一组行如下:
options(
warnPartialMatchArgs = TRUE,
warnPartialMatchDollar = TRUE,
warnPartialMatchAttr = TRUE
)
这将在 R 启动时运行,并在 R 中发生部分匹配时生成警告。如图所示,它发生在三个上下文中:在函数参数中、使用 $ 时和使用 attr() 时。我不认为你可以完全关闭部分匹配,但这应该在它发生时突出显示并防止随之而来的错误。
【讨论】: