3

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

感谢您的解释!

4

3 回答 3

9

这是预期的行为。当您分配给对象元素的索引时,如果该元素不存在,R 将创建该元素。在您的示例中,“dimnames”不存在aa,因此 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]] <- anythingL$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有一个额外的限制,它必须是一个列表,所以它反对并且你得到一个错误。

于 2012-09-25T08:32:02.783 回答
1

你可以使用

dimnames(bb)[[1]] <- list("c")

此命令会将名称指定为行名称。

我想这个错误是由于没有创建暗名列表。否则,如果您首先访问列表的第二部分 ( [[2]]),则将创建列表。因此,您也可以dimnames[[1]]事后访问。

于 2012-09-25T08:25:13.897 回答
0

我会按照错误所说的去做:

dimnames(bb)[[1]] <- list("c")
> bb
  [,1] [,2]
c   NA   NA

什么也有效:

dimnames(bb)[[1]] <- "c"
于 2012-09-25T08:31:17.633 回答