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"))