非常混乱的R特性-列表项名称的完成

非常混乱的R特性-列表项名称的完成,r,R,我发现R有一个非常令人惊讶和不愉快的特性-它完成了列表项名称!!!请参阅以下代码: a <- list(cov_spring = "spring") a$cov <- c() a$cov # spring ## I expect it to be empty!!! I've set it empty! a$co # spring a$c a您可以使用[或[[代替 a[“cov”]将返回一个包含空元素的列表。 a[[“cov”]将直接返回空元素。来自: 当您在exact=上向后滚

我发现R有一个非常令人惊讶和不愉快的特性-它完成了列表项名称!!!请参阅以下代码:

a <- list(cov_spring = "spring")
a$cov <- c()
a$cov
# spring  ## I expect it to be empty!!! I've set it empty!
a$co
# spring
a$c 

a您可以使用
[
[[
代替

a[“cov”]
将返回一个包含空元素的列表。
a[[“cov”]
将直接返回空元素。

来自:

当您在
exact=
上向后滚动并向上阅读时:

exact: Controls possible partial matching of '[[' when extracting by
      a character vector (for most objects, but see under
      'Environments').  The default is no partial matching.  Value
      'NA' allows partial matching but issues a warning when it
      occurs.  Value 'FALSE' allows partial matching without any
      warning.
因此,这在
$
[[
索引中为您提供了部分匹配功能:

mtcars$cy
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
mtcars[["cy"]]
# NULL
mtcars[["cy", exact=FALSE]]
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
我无法禁用
$
exact=FALSE
默认值(除非您想弄乱
格式,为了再现性和一致性,我不建议这样做)

正是出于这个原因,(出于防御目的)编程使用框架和列表应该更喜欢
[[
而不是
$
。(这很少见,但我一直被这种放纵的行为所折磨。)

编辑

为了澄清最后一点:

  • mtcars$cyl
    变为
    mtcars[[“cyl”]
  • mtcars$cyl[1:3]
    变成
    mtcars[[“cyl”][1:3]
  • mtcars[,“cy”]
    不是问题,mtcars[1:3,“cy”]

如果您使用
a[[“cov_-spring”]]
没有自动补全功能。谢谢@Stéphanelant!这是一个很好的解决方案。不管怎样,你知道为什么会这样,如果可以关闭它吗?我习惯于
$cov
,因为它比$cov\u短得多。对于赋值,没有自动补全功能。请参见
?提取
@Stéphanelant是的,显然是的,但用于读取我的值这是…谢谢你,史蒂文!这是一个很好的解决方案。不管怎样,你知道这是为什么吗,以及这是否可以关闭吗?我习惯于使用
$cov
,因为它非常短。你可以看到
?`$`
的文档。你会看到
[[
精确
参数默认为
$
[[…,exact=FALSE
。一个迂回的解决方案可能是打开
warnpartialmachdollar
选项,然后设置R将警告提升为错误。但这并不理想。啊,太棒了,谢谢!现在很清楚了……如果有一个解决方案将$exact=TRUE的默认值更改为,那就太棒了!!!!(预先:该选项很容易破坏再现性。)设置
选项(warnPartialMatchDollar=FALSE)
与设置
选项(stringsAsFactors=FALSE)
:只要脚本(或
~/.Rprofile
)运行良好已加载,但依赖此行为但正在不同环境中运行的代码的行为将不相同,并且没有明显的迹象表明会发生这种情况。如果使用此选项,请在每个脚本中使用它(使用
$
索引)。或使用
[[
。好的,但是
warnPartialMatchDollar
只是产生警告,而不是真正关闭此行为,对吗?这就是我要寻找的。没错,它不会改变行为(你不能这样做)实际上,从这个角度来看,在开发过程中启用此功能可能是有益的(尽管在“生产”使用过程中可能看不到它,这取决于您的使用情况)。(因为
$
和其他提取操作符都是
.Primitive
函数,所以您不可能在不重新编译R的情况下更改它们的默认行为。为此,祝您好运。)
mtcars$cy
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
mtcars[["cy"]]
# NULL
mtcars[["cy", exact=FALSE]]
#  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4