use*_*786 7 transpose r matrix
我有一个矩阵我试图在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
Run Code Online (Sandbox Code Playgroud)
Jos*_*ien 12
这个答案是不正确的,但是对我而言可能是有启发性的,对其他人来说也是如此,所以我会把它留下来.
正如@mnel所指出的那样,基本R函数t()必须被另一个同名函数掩盖.尝试删除该功能t()并t(xx)再次执行.我保证你会得到正确的结果.
你运行这个时得到了什么:
rm(t)
t(xx)
Run Code Online (Sandbox Code Playgroud)
如果(尽管我保证!)它仍然不起作用,你可以完全指定t()你想要使用的版本,如下所示:
base::t(xx)
Run Code Online (Sandbox Code Playgroud)
这就是为什么上述两个建议不充分的原因
来自?UseMethod:
命名空间可以注册泛型函数的方法.为了支持这一点,'UseMethod'和'NextMethod'在两个地方搜索方法: 首先在调用泛型函数的环境中,然后在定义泛型的环境的注册数据库中(通常是命名空间) ).因此,通用函数的方法需要在对泛型的调用环境中可用,或者必须注册它们.(它们在定义泛型的环境中是否可见并不重要.)
我错误地认为S3方法分派看起来像方法t.default() 首先在 base:::.__S3MethodsTable__.与随后也许在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
Run Code Online (Sandbox Code Playgroud)