2012-11-26 11 views
7

我有一個矩陣,我想在R中轉置,但t()函數沒有返回正確的答案。我如何轉置矩陣?如果通常的`t()`不起作用,如何在r中轉置一個矩陣?

> 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

您是否重新定義了工作空間中的't'函數? – mnel

+0

即類似於't < - function(...)rep(sqrt(.5),2)' –

+0

與此類似嗎? http://stackoverflow.com/a/12019678 – GSee

回答

12

這個答案是不正確的,但在那名啓發我,可能是其他的方式,所以我會離開它。

正如@mnel所述,基本R功能t()必須被另一個具有相同名稱的函數所掩蓋。嘗試刪除功能t()並再次執行t(xx)。我保證你會得到正確的結果。

當你運行這個你明白了什麼:

rm(t) 
t(xx) 

如果(!儘管我保證),它仍然無法正常工作,您可以完全指定要使用的,像這樣的t()版本:

base::t(xx) 

這也是爲什麼上面的兩個建議是不夠​​的

?UseMethod

命名空間可以註冊通用函數的方法。爲了支持 此,「UseMethod」和「NextMethod」搜索方法在兩個地方: 首先在其通用函數被調用環境, 然後在註冊數據基地環境,使 通用被定義(通常是一個名字空間)。因此,通用 函數的方法需要在調用 泛型的環境中可用,或者必須進行註冊。 (這不要緊,他們 是否在其中通用定義環境可見。)

我錯誤地認爲S3方法分派查找方法,如在base:::.__S3MethodsTable__.t.default()第一然後也許在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 
+1

如果不是這樣,那不會有幫助。默認值'被屏蔽......或者如果定義了't.matrix'方法。 ;-) – GSee

+0

@GSee - 它應該有所幫助。 'base :: t(xx)'應該首先在asNamespace(「base」)中查找,即使同名的函數在其他地方註冊,它也會找到't.default()',對不對? –

+2

首先使用globalenv()中定義的編號方法。 – GSee