我已经编写了自己的小型线性回归类,类似于 lm,并且想让它打印“函数调用”。我查看了 lm 代码并找到了 match.call(),但我相信这只有效,因为 lm 是通过函数定义的。我使用的是 RC 类,它通过初始化函数进行初始化。我想使用
linreg_mod <- linreg(formula=Petal.Length ~ Species, data=iris)
创建函数,并在初始化函数中定义 .self$call <<- match.call(expand.dots=TRUE)
。我知道 TRUE 是 Expand.dots 的默认值,但无论哪种方式,它似乎都没有做到这一点。当我打电话给 linreg_mod$call
时,我得到 .Object$initialize(formula = ..1, data = ..2)
。有谁知道为什么它给我 ..1, ..2,而不是我的输入?谢谢!
您应该能够通过参考类以通常的方式使用
match.call()
。这是一个最小的例子:
lm_wrapper <- setRefClass("lm_wrapper", methods = list(
match_call_demo = function(...) {
# Just to show you the output
as.list(match.call())
},
linreg = function(...) {
args <- as.list(match.call())
lm(formula = args$formula, data = get(args$data))
}
))
然后你可以用你的参数来调用它:
lm_model$match_call_demo(formula = Petal.Length ~ Species, data = iris)
# [[1]]
# lm_model$linreg
# $formula
# Petal.Length ~ Species
# $data
# iris
或者进行实际的回归:
lm_model$linreg(formula = Petal.Length ~ Species, data = iris)
# Call:
# lm(formula = args$formula, data = get(args$data))
# Coefficients:
# (Intercept) Speciesversicolor Speciesvirginica
# 1.462 2.798 4.090