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
}
我有一些代码可以从公式创建对象并保存调用以供将来使用,如下所示:
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
}