使用名为'x'的变量时更新公式时出现R错误:

时间:2013-03-04 13:01:55

标签: r formula

我正在尝试编写一个使用公式表达式的模型构建函数,但是我在理解模型update函数的工作原理时遇到了一些问题。

这是一个精简版功能,在使用update函数时会导致错误:

modelx <- function(formula) {         
  mf <- mc <- match.call()                         
  mf <- mf[c(1L,  match("formula", names(mf), 0L))]      
  mf[[1L]] <- as.name("model.frame")
  mf <- eval(mf, parent.frame())
  y <- model.response(mf, "numeric")
  mt <- attr(mf, "terms")      
  X <- model.matrix(mt, mf)
  out<-list(y=y,X=X)
  out$call<-mc
  out
}

代码几乎是从lm函数的开头复制的。一些示例数据和两个模型:

y<-x<-x1<-x2<-1:10
model<-modelx(y ~ x)
model1<-modelx(y ~ x1)

现在更新第一个模型不起作用,但第二个模型不起作用:

 model<-update(model, . ~ . + x2)
    Error in model.frame.default(formula = y ~ x + x2) : 
    invalid type (list) for variable 'x'
 model1<-update(model1, . ~ . + x2)

如果我将组件out$terms <- mt添加到modelx的输出中,则两种情况都有效。为什么需要这个组件?为什么更新功能在第二种情况下没有它而不在第一种情况下工作?

1 个答案:

答案 0 :(得分:4)

如果您查看update?update)的帮助,就会告诉您:

  

<强>描述

     

更新将更新并(默认情况下)重新安装模型。它通过提取存储在对象中的调用,更新调用和(默认情况下)评估该调用来完成此操作。有时仅使用一个参数调用update是有用的,例如,如果数据框已被更正。

     在update()和类似函数中的“提取调用”使用getCall(),它本身是一个(S3)泛型函数,默认方法只能获得x $调用。

     

因此,update()通常会自动(或通过默认方法)对新模型类起作用,或者通过为该类提供简单的getCall()方法。

     

<强>用法

     

更新(对象,...)

     

getCall(x,...)

我认为碰撞正在发生,因为信息正在传递到getCall函数,其中x是参数的名称,然后这会与您的{{1经历名称冲突并且语言正在选择x上的本地x