【问题标题】:what is `[[` looking for in this sapply example?在这个 sapply 示例中寻找什么 `[[`?
【发布时间】:2013-09-12 12:03:34
【问题描述】:

对此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 方法)在这里做什么吗?

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    您可以将 sapply 和 lapply 视为一个 for 循环,将 seq_along(NOSJ) 作为索引向量进行操作。

     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 作为第三个参数不会返回原子向量。我认为应该这样做。

    【讨论】:

    • 从技术上讲,它确实返回了一个命名向量。 is.vector( sapply( NOSJ, '[[' , 2 ) ) 返回 [1] TRUE。我不知道为什么它不看起来像一个矢量。
    • is.vector 是对结构的误导性测试。看is.vector(list(a=1,b=2))。从技术上讲,列表是向量,但这不是人们使用该语言的常用方式。
    • 我刚刚注意到了这一点。怎么可能?我正要发布一个这样的问题。
    • 根本区别在于“原子”和“递归”。
    • 啊,我明白了。谢谢。 RTM经典案例! +1
    【解决方案2】:

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

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

    有道理吗?所以[[ 在二级列表上运行,其中第一个元素 always 包含 only ab 因此可以强制转换为矩阵。 6 个列表中的第二个元素,always 包含 only a

    【讨论】:

    • 好的,我想我正在学习:-)。这符合我的预期:sapply(sapply(NOSJ,'[[',1),'[[',1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多