这个答案是不正确的,但对我和其他人来说都有启发,所以我将其保留。
正如 @mnel 指出的,基本 R 函数t()
必须被另一个同名函数屏蔽。尝试删除该功能t()
和做t(xx)
再次。我保证你会得到正确的结果。
当你运行这个时你会得到什么:
rm(t)
t(xx)
如果(尽管我保证!)它仍然不起作用,您可以完全指定t()
你想使用,像这样:
base::t(xx)
这就是为什么上面的两个建议是不够的
From ?UseMethod
:
命名空间可以注册通用函数的方法。支持
其中,‘UseMethod’和‘NextMethod’在两个地方搜索方法:首先在调用泛型函数的环境中, 和
然后在环境的注册数据库中
定义了泛型(通常是命名空间)。所以通用的方法
函数需要在调用环境中可用
通用,否则必须注册。 (无论他们是否
在定义泛型的环境中可见。)
我错误地认为 S3 方法调度会寻找类似的方法t.default()
first in base:::.__S3MethodsTable__.
and then也许在asNamespace("base")
before查看调用环境,而相反更接近事实。
从 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