可以使用部分名称访问R列表成员吗?这是一个功能吗?

Sun*_*ius 7 r

考虑这个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字典一样使用它时,这会引起明显的麻烦.

Dir*_*tel 8

这是一个旨在帮助交互模式的功能.你可以在当地收紧它,看哪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)

如果您愿意,可以进一步宣传错误警告(并在同一页面上描述该选项).


Min*_*ang 6

是的,$会做部分匹配。通过在控制台中键入来检查 $ 函数的 R 文档

?`$`
Run Code Online (Sandbox Code Playgroud)

在帮助文档中它说:

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

根据 Hadley Wickham 的书“Advanced R”,您可以$通过将全局选项设置为warnPartialMatchDollar来关闭部分匹配TRUE,但它可能会影响您加载的其他代码(例如从包中)的行为。

  • 我是堆栈溢出的新手,试图回答一个悬而未决的问题。我花了 20 分钟来阅读和理解问题,提出我的解决方案,在 R 中仔细检查并仔细写下我的答案。抱歉,我没有像您那样快速而彻底地想出答案。下次我会努力变得更好。 (3认同)