在kernlab
中的R
包中,有一个函数ksvm
,其中一个参数为kernel
。描述说parameter can be set to any function, of class kernel
。
我意识到包中定义了各种内核,但我想知道如何实现自己的内核。
我知道如何在R
中创建函数,但我不确定如何为函数提供类。
我怎样才能创建“类内核函数?”
答案 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类。检查源代码如何创建这些包,因为它使用类层次结构,其中各种内核函数具有特定的类并继承(通过contains
)kernel
类。这是一个例子:
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"))