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"