2016-11-14 8 views
0

"as.X"演算子は通常、ある型を別の型に変換しますが、配列に適用するとas.integerは失敗します。これはバグですか?これは、Microsoft R Openバージョン3.3 64ビット版、i686-pc-cygwin(32ビット版)のR Foundation's R 3.3.1版です。R:なぜas.characterはint matrixをcharに変換するのですか?as.integerはchar matrixをintに変換しませんか?

> m <- matrix(rnorm(25), 5) 
> m 
      [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] -0.5958330 -0.3139274 -0.4746246 0.2431716 -0.5245235 
[2,] 0.5677058 0.1944457 -2.3786936 0.2516587 -0.3541963 
[3,] 0.6763564 -1.7285476 -0.5878008 -1.2277048 0.7737145 
[4,] -1.4607755 -0.4761012 1.0995414 0.6978072 0.6120277 
[5,] 0.8593707 0.2962030 1.1791963 -0.2276658 1.1559314 
> m[] <- as.integer(m) 
> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 0 0 0 0 0 
[2,] 0 0 -2 0 0 
[3,] 0 -1 0 -1 0 
[4,] -1 0 1 0 0 
[5,] 0 0 1 0 1 
> m[] <- as.character(m) 
> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] "0" "0" "0" "0" "0" 
[2,] "0" "0" "-2" "0" "0" 
[3,] "0" "-1" "0" "-1" "0" 
[4,] "-1" "0" "1" "0" "0" 
[5,] "0" "0" "1" "0" "1" 
> m[] <- as.integer(m) 
> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] "0" "0" "0" "0" "0" 
[2,] "0" "0" "-2" "0" "0" 
[3,] "0" "-1" "0" "-1" "0" 
[4,] "-1" "0" "1" "0" "0" 
[5,] "0" "0" "1" "0" "1" 
+4

行列またはベクトルのサブセットに割り当てる場合、行列/ベクトルの型はより高い(より一般的な)型にのみ変更できます。 – Roland

+0

...特に、 'm [] < - as.integer(m)'は期待どおりに動作します。 – joran

+0

@joran:m [] < - as.integer(m)は期待通りに動作しません。既に投稿したコードを見てください。 –

答えて

6

ドキュメントの状態:インデックス式が割り当て の左側に表示されたら

は(subassignmentとしても知られている)を、Xの一部が 右手の値に設定されています割り当ての側。この場合、文字インデックスの一致部分は で、左辺は値を受け入れるために必要に応じて強制的に となります。ベクトルの場合、答えは 階層 < RAW論理<整数< <ダブル複雑な<文字<リスト<式のxと値の種類の上位のものであろう。

左のサブアサインメントで表示される動作は、その文書化された動作と一致しています。

> m <- matrix(rnorm(25), 5) 
> str(m) 
num [1:5, 1:5] 1.3807 -0.0858 1.4478 0.9509 0.6397 ... 
> typeof(m) 
[1] "double" 
> m[] <- as.integer(m) 
> str(m) 
num [1:5, 1:5] 1 0 1 0 0 0 0 0 -1 -1 ... 
> typeof(m) 
[1] "double" 

最後に、as.integerは、多くの場合、有効に文字を変換しません。直接、二重マトリックスに適用されたとき、それはまだ型階層のみのラウンドの後に続く、この場合の「作品」as.integerにもかかわらずこと

注意整数:それはNAの整数味、すなわちNA_integer_につながることを除いて

> str(as.integer("a")) 
int NA 
Warning message: 
In str(as.integer("a")) : NAs introduced by coercion 

...。

> str(as.integer("1")) 
int 1 

ベクトルについてのコメントを対処するために、文書化行動は、通常のベクトルに同じである:

> x <- rnorm(5) 
> x[] <- as.character(x) 
> x 
[1] "0.687551073804054" "-1.17843752343875" "0.144747745284427" "-0.931480738737143" "0.394279275668583" 
> x[] <- as.integer(x) 
> x 
[1] "0" "-1" "0" "0" "0" 
+0

私はまさに同じ回答を書こうとしていました。 – nicola

+0

x = as.character(1:9)を試してください。バツ; as.integer(x) –

+0

このドキュメントはここでは適用されません。まず、ドキュメントはベクトルに関するもので、as.integerは文字を整数に変換するベクトルとして期待しています。第二に、明示的な変換ではなく、暗黙的な強制についてです。これは、as.integerが行うはずのものです。 –

3

あなたが行う場合でも、それは限り何subassignmentがないので、整数に文字を変換します「ダウンキャスト」行列はあなたがstorage.mode()<-に興味があるかもしれないしたい:

> m <- matrix(1:4,2) 
> m 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 
> storage.mode(m) <- "character" 
> m 
    [,1] [,2] 
[1,] "1" "3" 
[2,] "2" "4" 
> storage.mode(m) <- "integer" 
> m 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 
0

Joranの答えは、この動作の原因となるルールを提供します。このルールの理由は、サブアサインメントがデータ構造全体で機能しないことがあります。その場合、ベクトルまたは行列のデータ型全体を変換することはできません。 m [] = ...の場合、それは可能ですが、すべての場合において同じように動作するほうがよいでしょう。さもなければ、索引によるサブアサインメントがまさにベクトルまたは行列全体をカバーするようになった場合にバグを導入するであろう。

関連する問題