2012-11-26 19 views
7

Mam macierz, którą próbuję transponować w R, ale funkcja t() nie zwraca poprawnej odpowiedzi. Jak mogę przetransponować matrycę?jak przetransponować macierz w r, jeśli zwykłe `t()` nie działa?

> 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 
+10

Czy na nowo zdefiniowałeś funkcję 't' w swoim obszarze roboczym? – mnel

+0

tj. Jako coś takiego jak 't <- function (...) rep (sqrt (.5), 2)' –

+0

Podobne do tego? http://stackoverflow.com/a/12019678 – GSee

Odpowiedz

12

Ta odpowiedź jest błędna, ale w taki sposób, aby były pouczające dla mnie i może być z innymi, więc zostawię go.

Jak odnotował @mnel, podstawowa funkcja R t() musi być zamaskowana przez inną funkcję o tej samej nazwie. Spróbuj ponownie usunąć funkcję t() i ponownie wykonaj t(xx). Gwarantuję, że uzyskasz poprawne wyniki.

Co otrzymasz po uruchomieniu tego:

rm(t) 
t(xx) 

if (! Pomimo mojego gwarancji) to nadal nie działa, można w pełni określić wersję t() chcesz użyć, na przykład:

base::t(xx) 

Oto dlaczego obydwa powyższe propozycje są niewystarczające

Od ?UseMethod:

Przestrzenie nazw mogą zarejestrować metody funkcji generycznych. Aby wesprzeć ten „UseMethod” i szukaj „NextMethod” metod w dwóch miejscach: najpierw w środowisku, w którym funkcja rodzajowy nazywa i następnie w bazie danych rejestracyjnych dla środowiska, w którym generic jest zdefiniowany (zazwyczaj przestrzeń nazw). Zatem metody dla ogólnej funkcji muszą być dostępne w środowisku połączenia z generic lub muszą być zarejestrowane. (Nie ma znaczenia, czy są one są widoczne w środowisku, w którym generyczny jest zdefiniowana.)

I błędnie zakłada, że ​​metoda S3 wysyłka szuka sposobów jak t.default()pierwszej w base:::.__S3MethodsTable__. i następnie Być może w asNamespace("base")przed patrząc w środowisku wywołującym, podczas gdy rewers jest bliższy prawdy.


Edit z GSEE

Oto sesji interaktywnej wykazać co mogło być problemem.

> 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 
+1

To nie pomoże, jeśli 't. default' jest maskowane ... lub jeśli zdefiniowano metodę 't.matrix'. ;-) – GSee

+0

@GZobacz - To powinno pomóc. 'base :: t (xx)' powinno najpierw wyglądać w 'asNamespace (" base ")', gdzie znajdzie 't.default()' nawet jeśli funkcja o tej samej nazwie jest zarejestrowana gdzie indziej, prawda? –

+2

Nie zdefiniowano metod zdefiniowanych w twoim globalenv(). – GSee