如果通常的`t()`不起作用,如何在r中转置矩阵?

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)

  • @ user1854786你正在养成坏习惯!`qqplot`也是`stats`包中的一个函数,它默认加载.正如您所见,使用现有名称创建函数可能会非常混乱; 你应该避免它. (3认同)
  • 首先使用globalenv()中定义的编号方法. (2认同)