R で転置しようとしている行列がありますが、t() 関数は正しい答えを返しません。行列を転置するにはどうすればよいですか?
> xx=matrix(c(3,7,4,8),2,byrow=TRUE)
> xx
[,1] [,2]
[1,] 3 7
[2,] 4 8
> t(xx)
[1] 0.7071068 0.7071068
この答えは間違っていますが、私にとっては啓発的であり、他の人にとっては啓発的だったので、そのままにしておきます.
@mnel が指摘したように、ベース R 関数t()
は同じ名前の別の関数でマスクする必要があります。t()
関数を削除して、t(xx)
やり直してください。正しい結果が得られることを保証します。
これを実行すると何が得られますか:
rm(t)
t(xx)
(私の保証にもかかわらず!) それでも動作しない場合は、次t()
のように、使用する のバージョンを完全に指定できます。
base::t(xx)
上記の2つの提案が不十分な理由は次のとおりです
から?UseMethod
:
名前空間は、ジェネリック関数のメソッドを登録できます。これをサポートするために、'UseMethod' と 'NextMethod' は 2 つの場所でメソッドを検索します。 最初はジェネリック関数が呼び出される環境で、次にジェネリック関数が定義されている環境の登録データベース (通常は名前空間)で検索します。 )。したがって、ジェネリック関数のメソッドは、ジェネリックの呼び出しの環境で使用できる必要があるか、登録されている必要があります。(ジェネリックが定義されている環境で可視かどうかは問題ではありません。)
S3 メソッドのディスパッチは呼び出し元の環境を参照する前に、おそらくt.default()
first in のようにメソッドを検索しbase:::.__S3MethodsTable__.
、次にin を検索すると誤って想定しましたが、逆の方が真実に近いです。asNamespace("base")
GSeeから編集
これは、何が問題であったかを示すインタラクティブなセッションです。
> t <- function(x, ...) print("generic masked")
> t.default <- function(x, ...) print("t.default masked")
> t.matrix <- function(x, ...) print("t.matrix was used")
> t.numeric <- function(x, ...) print("t.numeric was used")
> xx=matrix(c(3,7,4,8),2,byrow=TRUE)
> t(xx)
[1] "generic masked"
> base::t(xx)
[1] "t.matrix was used"
> rm(t.matrix)
> base::t(xx)
[1] "t.numeric was used"
> rm(t.numeric)
> base::t(xx)
[1] "t.default masked"
> rm(t.default)
> base::t(xx)
[,1] [,2]
[1,] 3 4
[2,] 7 8