理解R中的调用函数

时间:2014-04-07 08:01:29

标签: r

我从网上复制了这个功能:

# function used to predict Best Subset Selection Regression
predict.regsubsets = function(object, newdata, id, ...) {
    form = as.formula(object$call[[2]])
    mat = model.matrix(form, newdata)
    coefi = coef(object, id = id)
    mat[, names(coefi)] %*% coefi
}

但是,当我尝试在另一个函数中使用上述函数时,我不断收到以下错误。

library(leaps)    
abc <- function(){
        regfit <- regsubsets(lpsa ~.,data = XTraining, nvmax = 8)
        predict.regsubsets(regfit, data = XTesting, id = 1)
    }
    abc()
    Error in object$call[[2]] : subscript out of bounds

我已经在R中阅读了?call。但它并没有帮助我理解这里出了什么问题,特别是$call[[2]]是什么?

如何编辑上面的函数,以便当我在另一个函数中调用上面的函数时,我不会收到错误?

3 个答案:

答案 0 :(得分:1)

罪魁祸首是

form = as.formula(object$call[[2]])

这意味着object(您传递给函数的变量,在您的示例regfit中)有一个名为call的成员,这是一个至少包含两个元素的列表。 [[ ]]是用于获取列表元素的R运算符。

例如:

> a <- list(1:10, 1:5, letters[15:20])

> a[[2]]
[1] 1 2 3 4 5

> a[[3]]
[1] "o" "p" "q" "r" "s" "t"

然而

> a[[5]] # This does not work, as a only has three elements
Error in a[[5]] : subscript out of bounds

在您的案例?call中,您不应该检查object,而是检查生成regsubsets的函数的帮助。

?regsubsets或使用str(regfit)可以看出,该函数不会返回名为call的成员的对象。

要从regsubsets对象获取公式,您需要查看摘要的obj成员。

例如,您可以使用:

sm <- summary(regfit)
sm$obj$call

答案 1 :(得分:1)

你的错误在abc函数中。 predict.regsubsets中的参数称为newdata,但您引用的是data ....

答案 2 :(得分:0)

object可能是之前分析的输出(查看从哪个函数获取代码的位置)。第form = as.formula(objects$call[[2]])行提取用于创建对象的公式,并将其存储在form中。在接下来的行中,它用于创建新数据的模型矩阵,最后用它来预测新数据。