2012-11-26 3 views
7

Ich habe eine Matrix, die ich in R zu transponieren versuche, aber die Funktion t() gibt nicht die richtige Antwort zurück. Wie kann ich die Matrix transponieren?wie man eine Matrix in r transponiert, wenn das übliche `t()` nicht funktioniert?

> 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

Haben Sie die Funktion "t" in Ihrem Arbeitsbereich neu definiert? – mnel

+0

, d. H. Als etwas wie 't <- Funktion (...) rep (sqrt (.5), 2)' –

+0

Ähnliches? http://Stackoverflow.com/a/12019678 – GSee

Antwort

12

Diese Antwort ist falsch, aber in einer Weise, die mir erhellend waren und vielleicht für andere sein, also werde ich es überlassen.

Wie @Mnel bemerkt, muss die Basis-R-Funktion t() durch eine andere Funktion mit demselben Namen maskiert werden. Versuchen Sie, die Funktion t() wieder zu entfernen und t(xx) erneut auszuführen. Ich garantiere Ihnen, dass Sie die richtigen Ergebnisse erhalten.

Was bekommen Sie, wenn Sie laufen diese:

rm(t) 
t(xx) 

Wenn (! Trotz meiner Garantie) es funktioniert immer noch nicht arbeiten Sie in vollem Umfang die Version von t() Sie verwenden möchten, angeben können, wie folgt aus:

base::t(xx) 

hier, warum die beiden oben genannten Vorschläge nicht ausreichen

Von ?UseMethod:

Namespaces können für generische Funktionen Methoden registrieren. Zur Unterstützung dieses ‚UseMethod‘ und ‚NextMethod‘ Suche nach Methoden an zwei Stellen: zuerst in der Umgebung, in der die generischen Funktion genannt wird, und dann in den Basisregistrierungsdaten für die Umgebung, in der die generic ist definiert (normalerweise ein Namespace). So müssen Methoden für eine generische -Funktion in der Umgebung des Aufrufs an die Generika verfügbar sein, oder sie müssen registriert sein. (Es spielt keine Rolle, ob sie in der Umgebung zu sehen sind, in denen die allgemeinen definiert ist.)

geht ich davon aus, dass S3 Methode Dispatch für Methoden wie t.default()ersten sieht in base:::.__S3MethodsTable__. und dann vielleicht in asNamespace("base")vor in der rufenden Umgebung suchen, während das Gegenteil näher an der Wahrheit ist.


Bearbeiten von GSEE

Hier ist eine interaktive Sitzung zu zeigen, was das Problem gewesen sein könnte.

> 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

Das hilft nicht, wenn 't. default' ist maskiert ... oder wenn eine 't.matrix'-Methode definiert ist. ;-) – GSee

+0

@GSee - Es sollte helfen. 'base :: t (xx)' sollte zuerst in 'asNamespace (" base ")' suchen, wo es 't.default()' findet, auch wenn eine Funktion mit dem gleichen Namen woanders registriert ist, oder? –

+2

In Ihrem globalenv() definierte Methoden werden zuerst verwendet. – GSee

Verwandte Themen