是否可以直接调用S4方法?

时间:2014-11-28 07:52:00

标签: r

尝试构建gausspr模型并使用预测来预测输出。复制来自predict.gausspr文档的代码。

data(promotergene)

## create test and training set
ind <- sample(1:dim(promotergene)[1],20)
genetrain <- promotergene[-ind, ]
genetest <- promotergene[ind, ]

## train a support vector machine
gene <- gausspr(Class~.,data=genetrain,kernel="rbfdot",
                kpar=list(sigma=0.015))

## predict gene type probabilities on the test set
genetype <- predict(gene,genetest,type="probabilities")

这很好用。现在,当我尝试直接调用predict.gausspr时,它失败了。可以直接调用这个S4方法吗? 此外,在这种情况下,任何S4方法或特殊情况都是这种情况吗?

> genetype <- predict.gausspr(gene,genetest,type="probabilities")
Error: could not find function "predict.gausspr"

kernlab包已正确加载,并且能够执行?predict.gausspr并查看备注

1 个答案:

答案 0 :(得分:2)

我猜你的意思是kernlab包中的gausspr()函数。使用?gausspr中的代码段,我看到了

library(kernlab)
data(iris)
test <- gausspr(Species~., data=iris, var=2)
predict(test, iris[,-5])

test确实是一个S4对象

> isS4(test)
[1] TRUE
> class(test)
[1] "gausspr"
attr(,"package")
[1] "kernlab"

发现S4方法

使用showMethods()selectMethod()(为简洁起见编辑输出)发现了S4方法

> showMethods("predict")
Function: predict (package stats)
object="ANY"
object="gausspr"
object="kfa"
object="kha"
object="kpca"
object="kqr"
object="ksvm"
object="lssvm"
object="onlearn"
object="rvm"

> showMethods(class=class(test), where=search())
Function: alphaindex (package kernlab)
object="gausspr"

...
Function: predict (package stats)
object="gausspr"
...


> selectMethod("predict", class    Method Definition:

function (object, ...) 
{
    .local <- function (object, newdata, type = "response", coupler = "minpair") 
    {
        sc <- 0
        type <- match.arg(type, c("response", "probabilities", 
            "votes", "variance"))
...

如果没有相关的预测,gausspr方法,那么我们最终会得到一个预测的ANY方法,它实际上会调用methods("predict")发现的S3方法。

使用

发现帮助页面
?"predict,gausspr-method"

调试S4方法

traceback / recover

如果方法失败并且您想调试它,那么通常最简单的方法是使用?traceback找出错误发生的位置,并?recover来识别错误问题更详细。这是一个错误

> predict(test, mtcars)
Error in eval(expr, envir, enclos) : object 'Sepal.Length' not found

我们可以看到&#39;调用堆栈&#39;从1(通用&#39;预测&#39;)到2(方法&#39;预测,gausspr-mehtod&#39;)到3(.local函数,在gausspr方法中定义)等。< / p>

> traceback()
9: eval(expr, envir, enclos)
8: eval(predvars, data, env)
7: model.frame.default(object, data, xlev = xlev)
6: model.frame(object, data, xlev = xlev)
5: model.matrix.default(delete.response(terms(object)), as.data.frame(newdata), 
       na.action = na.action)
4: model.matrix(delete.response(terms(object)), as.data.frame(newdata), 
       na.action = na.action)
3: .local(object, ...)
2: predict(test, mtcars)
1: predict(test, mtcars)

error选项(请参阅?options)设置为recover,然后重试,选择.local函数中的帧编号,使其位于方法体内。

> options(error=recover)
> predict(test, mtcars)
Error in eval(expr, envir, enclos) : object 'Sepal.Length' not found

Enter a frame number, or 0 to exit   

1: predict(test, mtcars)
2: predict(test, mtcars)
3: .local(object, ...)
4: model.matrix(delete.response(terms(object)), as.data.frame(newdata), na.act
5: model.matrix.default(delete.response(terms(object)), as.data.frame(newdata)
6: model.frame(object, data, xlev = xlev)
7: model.frame.default(object, data, xlev = xlev)
8: eval(predvars, data, env)
9: eval(expr, envir, enclos)

Selection: 3
Called from: eval(predvars, data, env)
Browse[1]> ls()
[1] "coupler" "ncols"   "newdata" "nrows"   "object"  "oldco"   "sc"     
[8] "type" 

使用options(error=NULL)恢复正常错误行为。

debug / trace

调试S4方法有几件事要做。第一种是在所选方法上使用调试器

debug(selectMethod("predict", class(test)))

第二个是跟踪方法

trace("predict", browser, signature=class(test))

(停止跟踪untrace("predict", signature=class(test))

在这种特殊情况下,您会看到函数体位于名为.local的嵌套函数中。在外部函数上设置调试器是不够的,而是需要在外部函数中断,然后逐步执行直到.local已经定义而不是评估,并设置.local上的调试器,如(为了简洁而编辑输出)

> trace(predict, browser, signature=class(test))
Tracing specified method for function "predict" in environment
<namespace:stats>
Warning: Tracing only in the namespace; to untrace you will need:
untrace("predict", where = getNamespace("stats"))
[1] "predict"
attr(,"package")
[1] "stats"
> predict(test, iris[,-5])
Tracing predict(test, iris[, -5]) on entry 
Called from: eval(expr, envir, enclos)
Browse[1]> n
debug: {
    .local <- function (object, newdata, type = "response", coupler = "minpair") 
    {
        sc <- 0
        type <- match.arg(type, c("response", "probabilities", 
...
Browse[2]> n
debug: .local(object, ...)
Browse[2]> debug(.local)
Browse[2]> n
debugging in: .local(object, ...)
debug: {
    sc <- 0
    type <- match.arg(type, c("response", "probabilities", "votes", 
...
Browse[3]> 

kernlab软件包的作者 not 提供了S3风格的函数predict.gausspr,即使S4指南(?setMethod)表明他们这样做了。这样可以简化调试,例如debug(kernlab:::predict.gausspr)