什么是`[[`在这个公平的例子中寻找?

时间:2013-09-12 12:03:35

标签: r sapply

How to use `[[` and `$` as a function?问题的后续内容:我开始尝试使用原始设置(为简单起见,将大小从10000缩小到3)

JSON <- rep(list(x,y),3)
x <- list(a=1, b=1)
y <- list(a=1)
JSON <- rep(list(x,y),3)
sapply(JSON, "[[", "a")
[1] 1 1 1 1 1 1
sapply(JSON,"[[",'b')
[[1]]
[1] 1

[[2]]
NULL

[[3]]
[1] 1

[[4]]
NULL

[[5]]
[1] 1

[[6]]
NULL

sapply(JSON,'[[',1)
[1] 1 1 1 1 1 1
sapply(JSON,'[[',2)
Error in FUN(X[[2L]], ...) : subscript out of bounds

我认为我理解 - 搜索“b”与要求存在第二个元素不同。但随后,我创建了一个更深入的列表:

NOSJ<-rep(list(JSON),3)

sapply(NOSJ,'[[',1)
  [,1] [,2] [,3]
a 1    1    1   
b 1    1    1   
sapply(NOSJ,'[[',2)
$a
[1] 1

$a
[1] 1

$a
[1] 1

现在我的脑袋受伤了。有人可以扩展[[(或其sapply方法)在这里做什么吗?

2 个答案:

答案 0 :(得分:4)

您可以将sapply和lapply视为在seq_along(NOSJ)上作为索引向量运行的for循环。

 for( i in seq_along(NOSJ) NOSJ[[i]]  .... then use "[[" with the 3rd argument 

所以第一和第二个结果将是:

> NOSJ[[1]][[1]]
$a
[1] 1

$b
[1] 1

> NOSJ[[2]][[1]]
$a
[1] 1

$b
[1] 1

sapplylapply之间的区别在于sapply尝试使用simply2array返回矩阵或数组(如果返回值的维度都相同)(因为在这种情况下使用135作为第三个参数。老实说,我不知道为什么使用2,4或6作为第三个参数不返回一个原子向量。我认为应该。

答案 1 :(得分:3)

sapply(NOSJ,'[[',1)返回[[sapply传递给NOSJ的每个列表的第一个列表元素。尝试...

sapply( NOSJ , length )
[1] 6 6 6

有道理吗?因此[[正在二级列表中运行,其中第一个元素总是仅包含 ab因此是可强制的到矩阵。这些列表中的第二个元素为6,始终仅包含 a