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]] <- anythingは、それL$aがまだ存在しないということです。要素が存在しない場合、R は機能する最も単純なタイプの要素を作成するだけです。ご覧のとおり、が数値ベクトルのL$a[[1]] <- 5場合は意味L$aがあるので、R はそれを数値ベクトルにします。が数値ベクトルのL$b[[3]] <- "foo"場合は意味がありませんが、 が文字ベクトルの場合は意味があるため、R はそれを作成します。ただし、がリストの場合にのみ発生する可能性があるため、その場合はリストを取得します。L$bL$bL$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")

このコマンドは、名前を行名として割り当てます。

エラーは、dimnames のリストが作成されていないことが原因であると思われます。それ以外の場合、最初にリストの 2 番目の部分にアクセスすると ( [[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 に答える