考虑以下代码:
b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)
所以 a 实际上是一个列表列表。当我调用a$b
, 或a$c
时,为什么会NULL
返回?同样,如果我调用a$u
,a$v
或a$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)
考虑以下代码:
b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)
所以 a 实际上是一个列表列表。当我调用a$b
, 或a$c
时,为什么会NULL
返回?同样,如果我调用a$u
,a$v
或a$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)
$
索引运算符按名称索引列表。如果要从未命名列表中获取第一个元素,则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"
第一个是一个包含两个数值和一个列表的列表,第二个已被展平为一个命名的数字向量。
对于问题的第一部分,我们在 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,则函数递归地通过列表(和对列表)将它们的所有元素组合成一个向量。