如何查看特定“predict”函数的源代码?

如何查看特定“predict”函数的源代码?,r,R,根据文档,predict是R中的一个多态函数,根据作为第一个参数传递的内容实际调用不同的函数 但是,文档没有提供任何关于predict为任何特定类实际调用的函数名称的信息 通常,可以键入函数名以获取其源代码,但这不适用于predict 如果我想在对类型为glmnet的对象调用时查看predict函数的源代码,最简单的方法是什么?调用方法(predict)将显示为特定类定义的所有方法,例如: > methods(predict) [1] predict.ar*

根据文档,
predict
R
中的一个多态函数,根据作为第一个参数传递的内容实际调用不同的函数

但是,文档没有提供任何关于
predict
为任何特定类实际调用的函数名称的信息

通常,可以键入函数名以获取其源代码,但这不适用于
predict

如果我想在对类型为
glmnet
的对象调用时查看
predict
函数的源代码,最简单的方法是什么?

调用
方法(predict)
将显示为特定类定义的所有方法,例如:

> methods(predict)
 [1] predict.ar*                predict.Arima*             predict.arima0*            predict.glm               
 [5] predict.HoltWinters*       predict.lm                 predict.loess*             predict.mlm               
 [9] predict.nls*               predict.poly               predict.ppr*               predict.prcomp*           
[13] predict.princomp*          predict.smooth.spline*     predict.smooth.spline.fit* predict.StructTS*

glmnet
的预测函数很可能只是
predict.glmnet

您可以使用
getAnywhere
查找函数

getAnywhere("predict.glmnet")
## A single object matching ‘predict.glmnet’ was found
## It was found in the following places
##   registered S3 method for predict from namespace glmnet
##   namespace:glmnet
## with value
## 
## function (object, newx, s = NULL, type = c("link", "response", 
##     "coefficients", "nonzero", "class"), exact = FALSE, offset, 
##     ...) 
## {
##     type = match.arg(type)
##     if (missing(newx)) {
##         if (!match(type, c("coefficients", "nonzero"), FALSE)) 
##             stop("You need to supply a value for 'newx'")
##     }
##     if (exact && (!is.null(s))) {
##         lambda = object$lambda
##         which = match(s, lambda, FALSE)
##         if (!all(which > 0)) {
##             lambda = unique(rev(sort(c(s, lambda))))
##             object = update(object, lambda = lambda)
##         }
##     }
##     a0 = t(as.matrix(object$a0))
##     rownames(a0) = "(Intercept)"
##     nbeta = rbind2(a0, object$beta)
##     if (!is.null(s)) {
##         vnames = dimnames(nbeta)[[1]]
##         dimnames(nbeta) = list(NULL, NULL)
##         lambda = object$lambda
##         lamlist = lambda.interp(lambda, s)
##         nbeta = nbeta[, lamlist$left, drop = FALSE] * lamlist$frac + 
##             nbeta[, lamlist$right, drop = FALSE] * (1 - lamlist$frac)
##         dimnames(nbeta) = list(vnames, paste(seq(along = s)))
##     }
##     if (type == "coefficients") 
##         return(nbeta)
##     if (type == "nonzero") 
##         return(nonzeroCoef(nbeta[-1, , drop = FALSE], bystep = TRUE))
##     if (inherits(newx, "sparseMatrix")) 
##         newx = as(newx, "dgCMatrix")
##     nfit = as.matrix(cbind2(1, newx) %*% nbeta)
##     if (object$offset) {
##         if (missing(offset)) 
##             stop("No offset provided for prediction, yet used in fit of glmnet", 
##                 call. = FALSE)
##         if (is.matrix(offset) && dim(offset)[[2]] == 2) 
##             offset = offset[, 2]
##         nfit = nfit + array(offset, dim = dim(nfit))
##     }
##     nfit
## }
## <environment: namespace:glmnet>
getAnywhere(“predict.glmnet”)
##找到与“predict.glmnet”匹配的单个对象
##它被发现在以下地方
##从命名空间glmnet预测的注册S3方法
##名称空间:glmnet
##有价值
## 
##函数(对象,newx,s=NULL,type=c(“链接”,“响应”,
##“系数”、“非零”、“类”),精确=假,偏移,
##     ...) 
## {
##type=match.arg(类型)
##如果(缺少(newx)){
##if(!match(类型,c(“系数”,“非零”),FALSE))
##停止(“您需要为'newx'提供一个值)
##     }
##如果(精确&&(!is.null))){
##lambda=对象$lambda
##哪个=匹配(s,λ,FALSE)
##如果(!all(其中>0)){
##lambda=unique(版本(排序(c(s,lambda)))
##对象=更新(对象,lambda=lambda)
##         }
##     }
##a0=t(作为矩阵(对象$a0))
##行名(a0)=(截取)
##nbeta=rbind2(a0,对象$beta)
##如果(!为.null){
##vnames=dimnames(nbeta)[[1]]
##dimnames(nbeta)=列表(空,空)
##lambda=对象$lambda
##lamlist=lambda.interp(lambda,s)
##nbeta=nbeta[,lamlist$left,drop=FALSE]*lamlist$frac+
##nbeta[,lamlist$right,drop=FALSE]*(1-lamlist$frac)
##dimnames(nbeta)=列表(vnames,粘贴(seq(沿=s)))
##     }
##如果(类型=“系数”)
##返回(nbeta)
##如果(类型==“非零”)
##返回(非零系数(nbeta[-1,drop=FALSE],bystep=TRUE))
##if(继承(newx,“sparseMatrix”))
##newx=as(newx,“dgCMatrix”)
##nfit=as.矩阵(cbind2(1,newx)%*%nbeta)
##if(对象$offset){
##如果(缺少(偏移))
##停止(“未提供用于预测的偏移量,但用于glmnet的拟合”,
##呼叫(错误)
##如果(是矩阵(偏移量)&&dim(偏移量)[[2]]==2)
##偏移量=偏移量[,2]
##nfit=nfit+阵列(偏移量,尺寸=尺寸(nfit))
##     }
##nfit
## }
## 

在我使用
library(glmnet)
之后,没有使用该名称的方法。这就是我好奇的原因。一般来说,有没有一种方法可以判断给定特定对象时实际调用了哪些predict方法?只需快速查看一下实际的
glmnet
包,它看起来像
predict。glmnet
没有导出到全局命名空间中,因此有点难以获取,但是您可以使用
glmnet:::predict.glmnet
访问它,并查看使用
方法(class=glmnet)
定义的方法