如何创建指定类的函数?

时间:2013-11-17 10:57:44

标签: r

kernlab中的R包中,有一个函数ksvm,其中一个参数为kernel。描述说parameter can be set to any function, of class kernel

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

我知道如何在R中创建函数,但我不确定如何为函数提供类。

我怎样才能创建“类内核函数?”

1 个答案:

答案 0 :(得分:2)

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

> foo=function(x){x*2}
> class(foo)
[1] "function"
> class(foo)=c("function","kernel")
> class(foo)
[1] "function" "kernel"  
> foo(99)
[1] 198

或者c("kernel","function")。或者也许只是你要添加的类,因为在类列表中没有function的函数看起来很开心:

> class(foo)=c("kernel")
> foo(2)
[1] 4
> is.function(foo)
[1] TRUE
> 

然而,查看kernlab的来源告诉我这些东西是S4类。检查源代码如何创建这些包,因为它使用类层次结构,其中各种内核函数具有特定的类并继承(通过containskernel类。这是一个例子:

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()))
}

基础kernel类在包'aobjects.R文件中以这种方式定义:

setClass("kernel",representation("function",kpar="list"))