R 使用公式保存函数调用以在引导程序中重用

R saving function call with formula for reuse in bootstrapping

我有一些代码可以从公式创建对象并保存调用以供将来使用,如下所示:

create_obj <- function(formula, data) {
    obj <- list()
    # Populate obj with whatever we're interested in
    # ...        

    # Save call for future use
    obj$call <- match.call()
    obj
}

obj <- create_obj(time ~ sex, data)

如果我然后 bootstrap data 我可以轻松地在新数据集上构建模型:

data <- data[sample(1:nrow(data), replace=T), ]
new_obj <- eval(obj$call)

但是,如果我将公式保存在变量中并将对象传递到新环境中,这将不起作用:

do_stuff <- function(object, newdata) {
    data <- newdata[sample(1:nrow(newdata), replace=T), ]
    new_object <- eval(object$call)
}

main <- function() {
    my_form <- time ~ sex
    obj2 <- create_obj(my_form, data)
    # obj2$call: 'create_obj(formula = my_form, data = data)'

    do_stuff(obj2, data)

}

错误:找不到对象 my_form

我怎样才能让 obj$call 节省 time~sex 而不是 myform?否则我需要传递公式本身而不仅仅是对象,这限制了实用性。

以上示例不可重现,但您可以通过标准 lm 调用看到相同的结果。

编辑:我已经解决了问题,请参阅已接受的答案。

我已经解决了这个问题,方法是让构造函数通过评估本地环境中的常量参数来修改调用:

create_obj <- function(formula, data) {
    obj <- list()
    # Populate obj with whatever we're interested in
    # ...        

    # Save call for future use
    func_call <- match.call()
    func_call$formula <- eval(formula)

    # obj_call is now: create_obj(formula=time~sex, data=data)
    obj$call <- func_call
    obj
}