是否可以在`R`函数中查询其参数的默认值?

mer*_*011 6 r

在大多数情况下,函数参数的默认值在文档中给出.但是,在某些情况下,默认值是从其他参数(包括数据本身)计算的,因此无法在文档中指定.

例如,我如何发现库中lambda函数使用的默认网格?根据该文件,默认是基于计算的,默认为,和,这似乎是一个数据导出的值.glmnetglmnetlambdanlambda100lambda.min.ratio

当我使用给定的数据集运行此函数时,我想知道lambda它使用的值.这在使用时特别有用cv.glmnet,因为我想知道lambda当我不提供时它会选择哪个.

样本输入:

library(glmnet)

set.seed(1)
x=rnorm(100)
eps=rnorm(100)

y = 1 + x + x^2 + x^3 + eps

xmat=model.matrix(y~poly(x,10,raw=T),data=data.frame(x=x))

cv.out=cv.glmnet(xmat, y,alpha=0) # What is the lambda used here?
bestlam=cv.out$lambda.min
print(bestlam)


# When a grid is specified, the result is very different and sometimes worse.
grid=10^seq(10,-2,length=100)
cv.out=cv.glmnet(xmat, y,alpha=0, lambda=grid)
bestlam=cv.out$lambda.min
print(bestlam)
Run Code Online (Sandbox Code Playgroud)

样本输出(注意它们非常不同):

0.3619167
0.04037017
Run Code Online (Sandbox Code Playgroud)

flo*_*del 4

如果默认值取决于其他参数的值,那么除了在调用函数时以调试模式进入该函数之外,我看不到其他解决方案。您可以使用debugonce例如:

> debugonce(cv.glmnet)
> 
> cv.out=cv.glmnet(xmat, y,alpha=0) # What is the lambda used here?
debugging in: cv.glmnet(xmat, y, alpha = 0)
[...]
Browse[2]> ls()
#  [1] "foldid"       "grouped"      "keep"         "lambda"       "nfolds"       "offset"      
#  [7] "parallel"     "type.measure" "weights"      "x"            "y"           
Browse[2]> lambda
NULL
Browse[2]> c
>
Run Code Online (Sandbox Code Playgroud)

因此,对于第一个调用,lambdaNULL. 但是,如果您在第二次调用 时重复该方法cv.glmnet,您将看到在这种情况下lambda是一个长度为 100 的数值向量。