如何在 RC 类中使用 match.call() ?

问题描述 投票:0回答:1

我已经编写了自己的小型线性回归类,类似于 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,而不是我的输入?谢谢!

r oop lm
1个回答
0
投票

您应该能够通过参考类以通常的方式使用

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  
© www.soinside.com 2019 - 2024. All rights reserved.