考虑这个R代码
> l = list(key = 1)
> l$k
[1] 1
> l$ke
[1] 1
> l[['k']]
NULL
> names(l)
[1] "key"
Run Code Online (Sandbox Code Playgroud)
这是否意味着您可以使用$其部分名称访问列表成员?在一次令人沮丧的寻找虫子之后我发现这一点时,我无法相信自己的眼睛.
这是R列表的一个特征吗?它有名字吗?有可能把它关掉吗?当你像Python字典一样使用它时,这会引起明显的麻烦.
这是一个旨在帮助交互模式的功能.你可以在当地收紧它,看哪help(options)有
‘warnPartialMatchArgs’: logical. If true, warns if partial
matching is used in argument matching.
‘warnPartialMatchAttr’: logical. If true, warns if partial
matching is used in extracting attributes via ‘attr’.
‘warnPartialMatchDollar’: logical. If true, warns if partial
matching is used for extraction by ‘$’.
Run Code Online (Sandbox Code Playgroud)
例:
R> l <- list(key = 1)
R> l$k
[1] 1
R> options("warnPartialMatchDollar"=TRUE)
R> l$k
[1] 1
Warning message:
In l$k : partial match of 'k' to 'key'
R>
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以进一步宣传错误警告(并在同一页面上描述该选项).
是的,$会做部分匹配。通过在控制台中键入来检查 $ 函数的 R 文档
?`$`
Run Code Online (Sandbox Code Playgroud)
在帮助文档中它说:
双方
[[并$选择列表中的一个元素。主要区别在于$不允许计算索引,而允许[[。x$name相当于x[["name", exact = FALSE]]。此外,[[可以使用精确参数控制的部分匹配行为。
根据 Hadley Wickham 的书“Advanced R”,您可以$通过将全局选项设置为warnPartialMatchDollar来关闭部分匹配TRUE,但它可能会影响您加载的其他代码(例如从包中)的行为。