这是R中的错误还是有意义的?
## works
aa <- matrix(nrow=1,ncol=2)
dimnames(aa)[[2]] <- c("a","b")
dimnames(aa)[[1]] <- c("c")
## does not work
bb <- matrix(nrow=1,ncol=2)
dimnames(bb)[[1]] <- c("c")
Error in dimnames(bb)[[1]] <- c("c") : 'dimnames' must be a list
感谢您的解释!
答案 0 :(得分:9)
这是预期的行为。当您指定对象元素的索引时,如果该元素不存在,则R将创建该元素。在您的示例中,aa
中不存在“dimnames”,因此R会尝试根据您分配给它的内容创建“dimnames”。考虑分配列表中名为“a”,“b”和“c”的元素:
> L <- list()
> L$a[[1]] <- 5
> L$b[[3]] <- "foo"
> L$c[[4]] <- c(1,2,3)
> class(L$a)
[1] "numeric"
> class(L$b)
[1] "character"
> class(L$c)
[1] "list"
现在说L$a[[1]] <- anything
的问题是L$a
尚不存在。当元素不存在时会发生什么是R只是创建最简单的元素类型。如您所见,如果L$a[[1]] <- 5
是数字向量,L$a
将有意义,因此R使其成为数字向量。如果L$b[[3]] <- "foo"
是一个数字向量,L$b
没有意义,但如果L$b
是一个字符向量,那将是有意义的,这就是R创建的内容。但L$c[[4]] <- c(1,2,3)
只有在L$c
是列表时才会发生,所以在这种情况下你会得到一个列表。
在您的情况下,它会尝试根据该规则创建dimnames
;所以它使dimnames(aa)
成为一个列表,但它只使dimnames(bb)
成为一个字符向量。但dimnames
有一个额外的约束,它必须是一个列表,所以它对象,你得到一个错误。
答案 1 :(得分:1)
您可以使用
dimnames(bb)[[1]] <- list("c")
此命令将名称指定为行名。
我认为错误是由于没有创建的dimnames列表。否则,如果您首先访问列表的第二部分([[2]]
),则会创建列表。因此,您之后也可以访问dimnames[[1]]
。
答案 2 :(得分:0)
我会做错误所说的:
dimnames(bb)[[1]] <- list("c")
> bb
[,1] [,2]
c NA NA
什么也有效:
dimnames(bb)[[1]] <- "c"