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

Flo*_*ian 3 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
Run Code Online (Sandbox Code Playgroud)

谢谢你的解释!

cro*_*ing 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"
Run Code Online (Sandbox Code Playgroud)

现在说的问题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有一个额外的约束,它必须是一个列表,所以它对象,你得到一个错误.