5

考虑以下代码:

b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)

所以 a 实际上是一个列表列表。当我调用a$b, 或a$c时,为什么会NULL返回?同样,如果我调用a$u,a$va$w,NULL则返回。

以下之间也有区别:

c(list(a=1,b=2,c=list(d=5,e=9))) 

c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T)
4

2 回答 2

4

$索引运算符按名称索引列表。如果要从未命名列表中获取第一个元素,则a需要a[[1]].

您可以创建一个函数,如果未指定名称,则自动添加名称,类似于工作方式data.frame(此版本是全有或全无 - 如果命名了某些参数,它将不会命名剩余的未命名的参数)。

nlist <- function(...) {
    L <- list(...)
    if (!is.null(names(L))) return(L)
    n <- lapply(match.call(),deparse)[-1]
    setNames(L,n)
}

b <- c <- d <- 1

nlist(b,c,d)
nlist(d=b,b=c,c=d)

对于第二个问题,答案是“是”;你试过了吗???

L <- list(a=1,b=2,c=list(d=5,e=9))
str(c(L)) 
## List of 3
##  $ a: num 1
##  $ b: num 2
##  $ c:List of 2
##   ..$ d: num 5
##   ..$ e: num 9
str(c(L,recursive=TRUE))
##  Named num [1:4] 1 2 5 9
##  - attr(*, "names")= chr [1:4] "a" "b" "c.d" "c.e"

第一个是一个包含两个数值和一个列表的列表,第二个已被展平为一个命名的数字向量。

于 2013-01-02T14:29:00.790 回答
3

对于问题的第一部分,我们在 R 语言定义文档中

使用 $ 的形式适用于递归对象,例如列表和对列表。它只允许文字字符串或符号作为索引。也就是说,索引是不可计算的:对于需要计算表达式以找到索引的情况,请使用 x[[expr]]。

所以你可以改变你的 aa <- list(b,c)a <- list(b=b,c=c)

 a$b =  a[['b']]   ## expression 
$u
[1] 5

$v
[1] 12

对于问题的第二部分,您可以尝试例如应用$运算符,以查看差异。

> kk <- c(list(a=1,b=2,c=list(d=5,e=9)))              ## recursive objects
> hh <- c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T) ## atomic objects
> kk$a
[1] 1
> hh$a
Error in hh$a : $ operator is invalid for atomic vectors

因为我们从 ?c 得到一个向量,对于 hh

如果 recursive = TRUE,则函数递归地通过列表(和对列表)将它们的所有元素组合成一个向量。

于 2013-01-02T14:50:07.057 回答