非常混乱的R特性-列表项名称的完成
我发现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=上向后滚
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