R矩阵的矩阵,奇怪的行为

时间:2012-09-25 07:49:51

标签: r

这是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

感谢您的解释!

3 个答案:

答案 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"