提取运算符“$( )”和非语法名称

Álv*_*gas 7 scope r function list

假设我有以下列表(注意非语法名称的用法)

list <- list(A  = c(1,2,3),
            `2` = c(7,8,9))
Run Code Online (Sandbox Code Playgroud)

因此,以下两种解析列表的方法有效:

`$`(list,A)
## [1] 1 2 3

`$`(list,`2`)
## [1] 7 8 9
Run Code Online (Sandbox Code Playgroud)

然而,这种方式继续失败。

id <- 2 
`$`(list,id)
## NULL
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么最后一种方法不起作用以及我该如何解决它吗?谢谢。

Mik*_*gan 2

您的id是“计算索引”,运算符不支持该$索引。从?Extract

[[选择$列表中的单个元素。主要区别在于$不允许计算索引,而[[允许。 x$name相当于x[["name", exact = FALSE]].

如果您有计算索引,请使用[[提取。

l <- list(a = 1:3)
id <- "a"

l[[id]]
## [1] 1 2 3

`[[`(l, id) # the same
## [1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用$运算符,则需要替换id调用中的值$,如下所示:

eval(bquote(`$`(l, .(id))))
## [1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

id是否非语法并不重要:

l <- list(`!@#$%^` = 1:3)
id <- "!@#$%^"

l[[id]]
## [1] 1 2 3

`[[`(l, id)
## [1] 1 2 3

eval(bquote(`$`(l, .(id))))
## [1] 1 2 3
Run Code Online (Sandbox Code Playgroud)