R保存函数调用公式,以便在引导中重用

时间:2017-06-30 15:24:14

标签: r formula 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)

如果我然后引导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调用看到相同的内容。

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

1 个答案:

答案 0 :(得分:0)

我通过让构造函数通过评估本地环境中的常量参数来修改调用来解决它:

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
}