请考虑以下代码:
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)
答案 0 :(得分:4)
$
索引运算符通过 name 为列表编制索引。如果您想从未命名列表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"
第一个是包含两个数值和一个列表的列表,第二个已被展平为一个命名的数字向量。
答案 1 :(得分:3)
对于问题的第一部分,we have in The R language definition document
使用$的表单适用于递归对象,例如列表和 成对列表。它只允许文字字符串或符号 指数。也就是说,索引是不可计算的:对于你的情况 需要评估表达式以找到索引,使用x [[expr]]。
因此,您可以将a从a <- 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,则函数以递归方式下降到列表中 (和pairlists)将所有元素组合成一个向量。