我正在尝试编写一些函数来简化多个模型的改装,但我发现这很痛苦,因为当R深入到评估树中时,它无法找到合适的data。尽管已经努力将公式环境存储在模型中,但我猜真的没有办法明确地指向原始数据对象。这对于使用survfit拟合生存曲线变得更加困难,其中没有terms对象存储在其中。
我真的需要每次都将数据/公式作为参数重新键入吗?
示例:
# model-fitting wrapper function
fn <- function(fn_formula, fn_data) {
lm(formula = fn_formula, data = fn_data)
}
# specify exemplary data and formula
data <- data.frame(
y = rnorm(100),
x1 = rnorm(100),
x2 = rnorm(100))
formula <- y ~ x1
# try to create and update the fit with different parameters
fn_fit <- fn(formula, data)
update(fn_fit, ~ x2)
# Error in is.data.frame(data) : object 'fn_data' not found
terms(fn_fit) %>% attr('.Environment')
# <environment: R_GlobalEnv>
terms(fn_fit$model) %>% attr('.Environment')
# <environment: R_GlobalEnv>
getCall(fn_fit)
# lm(formula = fn_formula, data = fn_data)发布于 2017-06-27 06:15:33
对于同名的lm()和update(),存储数据的变量应该在相同的作用域中。不确定你真正想要完成的是什么,如果你想要一个函数来创建一个可以在全局环境中使用的签名,你可以这样做
fn <- function(fn_formula, fn_data) {
do.call("lm", list(fn_formula, data=substitute(fn_data)))
}
fn_fit <- fn(formula, data)
update(fn_fit, ~ x2)否则,如果您真的想在本地函数作用域中捕获该变量,您可以创建一个帮助器,以便在正确的环境中进行有趣的更新。
fn <- function(fn_formula, fn_data) {
environment(fn_formula) <- environment()
lm(formula = fn_formula, data = fn_data)
}
fn_update <- function(object, ...) {
mc<-match.call(definition = update)
mc[[1]] <- quote(update)
eval(mc, envir=environment(terms(object)))
}
fn_fit <- fn(formula, data)
fn_update(fn_fit, ~x2)发布于 2017-06-27 12:28:29
当您传递公式时,“model”子列表中存储的唯一项是那些需要的项。
> names(fn_fit$model)
[1] "y" "x1"但该对象中没有命名为'data‘或'fn_data’的内容。MrFlick第二个建议对框架调用树中的修改更具弹性:
> fn <- function(fn_formula, fn_data) {
+ do.call("lm", list(fn_formula, data=substitute(fn_data)))
+ }
> fn_fit <- fn(formula, data); rm(data) # mess with the calling environment
> update(fn_fit, ~ x2)
Error in terms.formula(formula, data = data) :
'data' argument is of the wrong type出现这个错误是因为R解释器只找到了名为data的函数;如果您部署了第二个选项,则会得到:
> data <- data.frame(
+ y = rnorm(100),
+ x1 = rnorm(100),
+ x2 = rnorm(100))
> fn <- function(fn_formula, fn_data) {
+ environment(fn_formula) <- environment()
+ lm(formula = fn_formula, data = fn_data)
+ }
>
> fn_update <- function(object, ...) {
+ mc<-match.call(definition = update)
+ mc[[1]] <- quote(update)
+ eval(mc, envir=environment(terms(object)))
+ }
>
> fn_fit <- fn(formula, data) ; rm(data)
> fn_update(fn_fit, ~x2)
Call:
lm(formula = y ~ x2, data = fn_data)
Coefficients:
(Intercept) x2
0.01117 -0.13004 https://stackoverflow.com/questions/44769299
复制相似问题