非常令人困惑的R功能-列表项名称的完成

时间:2018-08-28 17:54:08

标签: 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 

我不知道该怎么办...。我需要能够将$ cov设置为NULL,并同时在其中设置$ cov_spring !!!并分别使用$ cov!真烦人!

我的问题:

  1. 这是怎么回事?这怎么可能,背后的逻辑是什么?
  2. 有一些简单的解决方法,如何关闭此完成功能?我需要独立使用列表项cov_spring和cov,就像它们是普通变量一样。请不要该死的完成!!!

2 个答案:

答案 0 :(得分:7)

来自help("$")

'x$name' is equivalent to 'x[["name", exact = FALSE]]'

当您向后滚动并在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的{​​{1}}默认设置(除非您想弄乱$,而我不这样做为了重现性和一致的行为而推荐)。

正是出于这个原因,出于防御目的,出于编程目的使用框架和列表(出于防御目的)应该更喜欢formals。 (这种情况很少见,但是这种宽容的行为让我很伤心。)

修改

为最后一点清楚起见:

  • [[成为$
  • mtcars$cyl成为mtcars[["cyl"]]
  • mtcars$cyl[1:3]没问题,mtcars[["cyl"]][1:3]也不是问题

答案 1 :(得分:1)

您可以改用[[[

a["cov"]将返回带有NULL元素的列表。 a[["cov"]]将直接返回NULL元素。