R 如何创建指定类的函数?

R 如何创建指定类的函数?,r,R,在R中的kernelab包中,有一个函数ksvm,其参数之一是kernel。说明中说,参数可以设置为内核类的任何函数 我知道包中定义了各种内核,但我想知道如何实现自己的内核 我知道如何在R中创建函数,但不知道如何为函数赋予类 如何创建“类内核的函数?”只需按常规方式分配其类: > foo=function(x){x*2} > class(foo) [1] "function" > class(foo)=c("function","kernel") > class(foo)

R
中的
kernelab
包中,有一个函数
ksvm
,其参数之一是
kernel
。说明中说,
参数可以设置为内核类的任何函数

我知道包中定义了各种内核,但我想知道如何实现自己的内核

我知道如何在
R
中创建函数,但不知道如何为函数赋予类


如何创建“类内核的函数?”

只需按常规方式分配其类:

> foo=function(x){x*2}
> class(foo)
[1] "function"
> class(foo)=c("function","kernel")
> class(foo)
[1] "function" "kernel"  
> foo(99)
[1] 198
或者可能
c(“内核”、“函数”)
。或者可能只是您想要添加的类,因为函数在其类列表中没有
function
,似乎很开心:

> class(foo)=c("kernel")
> foo(2)
[1] 4
> is.function(foo)
[1] TRUE
> 
然而,查看
kernlab
的源代码,我发现这些都是S4类。检查源代码以了解包是如何创建这些类的,因为它使用类层次结构,其中各种内核函数都有一个特定的类并继承(通过
包含
内核
类)。这里有一个例子:

setClass("vanillakernel",prototype=structure(.Data=function(){},kpar=list()),contains=c("kernel"))

vanilladot <- function( )
{
  rval<- function(x, y = NULL)
    {
      if(!is(x,"vector")) stop("x must be a vector")
      if(!is(y,"vector")&&!is.null(y)) stop("y must be a vector")
      if (is(x,"vector") && is.null(y)){
        crossprod(x)
        }

      if (is(x,"vector") && is(y,"vector")){
        if (!length(x)==length(y))
            stop("number of dimension must be the same on both data points")
        crossprod(x,y)
          }

      }
  return(new("vanillakernel",.Data=rval,kpar=list()))
}

看看
?类
setClass("kernel",representation("function",kpar="list"))