R 导出并使用S3方法处理';svd';?

R 导出并使用S3方法处理';svd';?,r,R,我正在尝试为应用于一些自定义类的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") retur

我正在尝试为应用于一些自定义类的
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)
}
但是,当我尝试打电话时,我收到的不是消息,而是以下消息:

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
set.seed(123)

mat您可以通过泛型重写非泛型函数,然后提供所需的方法。因此,在你的情况下:

#' @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)
}
#@S3method svd foo

svd.foo您可以通过泛型重写非泛型函数,然后提供所需的方法。因此,在你的情况下:

#' @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)
}
#@S3method svd foo

svd.foo
svd
不是一种方法。如果您查看源代码,没有
UseMethod
,因此只要调用它,它就会运行常规的
svd
。那么还有什么方法可以这样做吗?否则,我想我可以为S4方法创建一个新的泛型。@cdeterman当然,您可以通过提供一个
svd=function(x,…)UseMethod('svd')
和另外一个
svd.default=base::svd
svd
转换为S3泛型。不需要去S4。@KonradRudolph是的,就是这样。我只需要导出通用的。谢谢,请随意在下面给出答案。
svd
不是一种方法。如果您查看源代码,没有
UseMethod
,因此只要调用它,它就会运行常规的
svd
。那么还有什么方法可以这样做吗?否则,我想我可以为S4方法创建一个新的泛型。@cdeterman当然,您可以通过提供一个
svd=function(x,…)UseMethod('svd')
和另外一个
svd.default=base::svd
svd
转换为S3泛型。不需要去S4。@KonradRudolph是的,就是这样。我只需要导出通用的。谢谢,请随时在下面给出答案。