提取运算符 `$( )` 和非句法名称

Extract operator `$( )` and non-syntactic names

假设我有以下列表(注意 non-syntactic names 的用法)

list <- list(A  = c(1,2,3),
            `2` = c(7,8,9))

所以下面两种解析列表的方法有效:

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

`$`(list,`2`)
## [1] 7 8 9

但是,这种方法无法继续。

id <- 2 
`$`(list,id)
## NULL

谁能解释一下为什么最后一种方法不起作用,我该如何解决?谢谢。

我也在努力更好地掌握 non-syntactic 个名字。不幸的是,很难找到更复杂的使用模式。首先,阅读 ?Quotes.

为了学习的目的,这里有一些代码:

list <- list(A  = c(1,2,3),
             `2` = c(7,8,9))

id <- 2 

id_backtics <- paste0("`", id,"`")

text <- paste0("`$`(list, ", id_backtics, ")")
text
#> [1] "`$`(list, `2`)"

eval(parse(text = text))
#> [1] 7 8 9

reprex package (v2.0.1)

于 2022-01-24 创建

您的 id 是一个“计算索引”,$ 运算符不支持它。来自 ?Extract:

Both [[ and $ select a single element of the list. The main difference is that $ does not allow computed indices, whereas [[ does. x$name is equivalent to 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

如果你坚持使用$运算符,那么你需要在$调用中替换id的值,像这样:

eval(bquote(`$`(l, .(id))))
## [1] 1 2 3

id是否是non-syntactic并不重要:

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