r导出并使用 S3 方法进行"svd"?

  • 本文关键字:svd 方法 S3
  • 更新时间 :
  • 英文 :


我试图为应用于几个自定义类的svd函数创建S3方法。为了使事情尽可能地重现,我用下面这个简单的例子来演示这个问题。

使用roxygen2:

# create generic
svd <- function(x, ...) UseMethod("svd")
# add defai;t
svd.default <- base::svd
#' @export
svd.foo <- function(x, ...){
  print("called svd.foo")
  return(NULL)
}

然后构建并重新加载包。我可以在NAMESPACE中看到:

S3method(svd,foo)

然而,当我尝试呼叫时,我得到以下内容而不是消息:

set.seed(123)
mat <- matrix(rnorm(16), 4)
class(mat) <- "foo"
svd(mat)
$d
[1] 2.5909540 2.2850508 1.2608444 0.1467173
$u
           [,1]       [,2]       [,3]        [,4]
[1,] -0.1212454  0.3981507 -0.1101441  0.90257625
[2,]  0.4356515  0.4471180 -0.7466406 -0.22982835
[3,]  0.4227691 -0.7681500 -0.3229738  0.35622984
[4,] -0.7853493 -0.2269518 -0.5710376 -0.07506889
$v
           [,1]       [,2]       [,3]        [,4]
[1,]  0.2204894 -0.6736805 -0.2459399  0.66109954
[2,]  0.7409901  0.3288187 -0.5720323 -0.12486370
[3,]  0.0478777 -0.6541094 -0.1526053 -0.73929712
[4,] -0.6324760  0.1008651 -0.7674661  0.02821745

仍然调用基本的svd方法。我怎样才能做到这一点呢?

可以用泛型覆盖非泛型函数,然后提供所需的方法。所以在你的例子中:

#' @export svd
svd = function (x, ...)
    UseMethod('svd')
#' @S3method svd default
svd.default = base::svd

当然你也可以添加你自己的方法:

#' @S3method svd foo
svd.foo <- function(x, ...) {
  print("called svd.foo")
  return(NULL)
}

根据Hadley,您应该而不是一般@export S3方法-导出通用并将方法标记为@S3method s就足够了。

相关内容

最新更新