如何在RC类中使用match.call()?调用参数显示异常求助
问题原因及解决办法
异常原因
这是RC类的初始化机制导致的:当你调用linreg(...)创建实例时,底层实际是通过new("linreg", ...)触发初始化,而initialize方法是在new函数内部被调用的。此时match.call捕获的是**initialize被调用时的上下文**,也就是new内部的.Object$initialize(formula = ..1, data = ..2),而非你直接输入的linreg(...)调用语句。
修复方案
不要在initialize方法中捕获调用,而是在自定义的构造函数(即linreg函数)中先捕获用户的原始调用,再将其赋值给RC实例的call属性:
# 定义RC类 linreg <- setRefClass("linreg", fields = list( call = "language", formula = "formula", data = "data.frame" ), methods = list( initialize = function(formula, data) { .self$formula <- formula .self$data <- data # 不在initialize中处理call } ) ) # 重写构造函数以捕获原始调用 linreg <- function(formula, data) { captured_call <- match.call() obj <- new("linreg", formula = formula, data = data) obj$call <- captured_call obj } # 测试 linreg_mod <- linreg(formula=Petal.Length ~ Species, data=iris) linreg_mod$call # 输出:linreg(formula = Petal.Length ~ Species, data = iris)
内容的提问来源于stack exchange,提问作者MKJ
相关产品推荐
相关产品推荐

