我发现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!真烦人!
我的问题:
答案 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元素。