R 美元运算符作为sapply未按预期工作的函数参数

R 美元运算符作为sapply未按预期工作的函数参数,r,lapply,sapply,dollar-sign,R,Lapply,Sapply,Dollar Sign,我有以下清单 test_list=list(list(a=1,b=2),list(a=3,b=4)) 我想提取列表元素名为a的所有元素 我可以通过 sapply(test_list,`[[`,"a") 这给了我正确的结果 #[1] 1 3 当我对Rs-dollar操作符尝试相同的操作时,我得到了NULL sapply(test_list,`$`,"a") #[[1]] #NULL # #[[2]] #NULL 但是,如果我在test\u list的单个元素上使用它,它将按预期工作 `$`

我有以下清单

test_list=list(list(a=1,b=2),list(a=3,b=4))
我想提取列表元素名为
a
的所有元素

我可以通过

sapply(test_list,`[[`,"a")
这给了我正确的结果

#[1] 1 3
当我对Rs-dollar操作符尝试相同的操作时,我得到了
NULL

sapply(test_list,`$`,"a")
#[[1]]
#NULL
#
#[[2]]
#NULL
但是,如果我在
test\u list
的单个元素上使用它,它将按预期工作

`$`(test_list[[1]],"a")
#[1] 1

我是否遗漏了一些显而易见的东西?

根据我所能确定的,这是两件事的结合

首先

其次,当参数被传递给函数时,它们被分配给函数调用中相应的变量。当传递给
sapply
时,“a”
被分配给变量,因此将不再使用
$
。我们可以通过运行来看到这一点

sapply("a", print)
[1] "a"
  a 
"a"
这会导致像这样的特殊结果

sapply(test_list, function(x, a) {`$`(x, a)})
[1] 1 3

其中,尽管
a
是一个变量(甚至还没有被赋值)
$
将其与列表中元素的名称相匹配。

求值与无

[
计算其参数,而
$
不计算。
L[[a]]
获取
L
的组件,其名称保存在变量
a
$
只是将参数名称本身作为字符串传递,因此
L$a
查找
“a”
L
a
的组件不被视为包含组件名称的变量,而只是一个字符串

下面的
L[[b]]
返回名为
“a”的
L
的组件,因为变量
b
具有值
“a”
,而
L$b
返回名为
L
的组件
因为在这种语法中,
b
不被视为变量,而是被视为一个字符串,它本身被传递

L <- list(a = 1, b = 2)
b <- "a"
L[[b]] # same as L[["a"]] since b holds a
## [1] 1
L$b  # same as L[["b"]] since b is regarded as a character string to be passed
## [1] 2

在第一种情况下,
sapply
正在调用
任何$…
,而
..
没有被计算,因此它将寻找一个字面上命名为
“…”的列表组件
当然,没有这样的组件,因此
which$…
为空,因此问题输出中显示为空。在第二种情况下
which[[…]]
计算为
which[[“a”]]
因此得到了观察到的结果。

非常有趣的答案!它基本上表明已经
x=“a”;“$”(test\u list[[1]],x);
给出了不正确的结果。此外,与您所说的类似,
“$”(测试列表[[1]],a)
给出了
1
,尽管没有定义对象
a
foo_list <- test_list
class(foo_list[[1]]) <- class(foo_list[[2]]) <- "foo"

"$.foo" <- "[[.foo" <- function(x, name) print(name)

result <- sapply(foo_list, "$", "a")
## "..."
## "..."

result2 <- sapply(foo_list, "[[", "a")    
## [1] "a"
## [1] "a"