【问题标题】:How to replace call inside an lm() object?如何替换 lm() 对象内的调用?
【发布时间】:2018-07-10 18:48:04
【问题描述】:

miceadds::lm.cluster() 中,调用以stats::lm(formula = formula, data = data) 这种方式表示,我想用实际公式替换它。

例如,函数调用存储在lm() 对象中

fit <- lm(Sepal.Length ~ Petal.Length, iris)
> fit$call
lm(formula = Sepal.Length ~ Petal.Length, data = iris)

我正在尝试使用 call() 更改它,但到目前为止没有成功。

fit$call <- call("lm(formula = Sepal.Length ~ Petal.Length, data = iris, foo = NULL)")
> fit$call
`lm(formula = Sepal.Length ~ Petal.Length, data = iris, foo = NULL)`()

最后有``()。虽然class() 产生call,但它仍然与lm(formula = Sepal.Length ~ Petal.Length, data = iris, foo = NULL) 不同。

我也尝试了formula()reformulate(),但都失败了。

我该怎么做?

【问题讨论】:

  • 您在寻找update()吗?
  • 目的是什么?这似乎是朝着可能以另一种方式更好地处理的事情迈出的一步。
  • @Aaron 这与miceadds::lm.cluster()有关,请查看我的编辑。
  • @r2evans 不是真的,我在编辑中解释过。

标签: r lm method-call


【解决方案1】:

这样就可以了,但我们仍然很好奇为什么......

您遇到的问题是call 没有像您提供的那样进行完整的函数调用;相反,只需将函数名称作为第一个参数,然后是您要使用的参数,引用您不想评估的任何内容。

> fit$call <- call("lm", Sepal.Length ~ Petal.Length, 
                   data=quote("iris"), foo=NULL)
> fit

Call:
lm(Sepal.Length ~ Petal.Length, data = "iris", foo = NULL)

Coefficients:
 (Intercept)  Petal.Length  
      4.3066        0.4089  

这可能是miceadds 应该做的,尽管do.call 实际执行它;如果是这样,它将根据需要记录通话。一个例子请参见https://stackoverflow.com/a/17026386/210673

您也许可以创建自己的函数来调用lm.cluster 并执行您想要的操作,请参见下面的示例。在研究它之后,修复lm.cluster 会很棘手,至少对于data 部分,formula 部分将是一个简单的修复。对于数据,它更难处理,因为函数可以传递一个表达式而不是一个对象的名称。

lm.special <- function(formula, data, ... ) {
  lm(formula=formula, data=data, ...)
}

lm.special2 <- function(formula, data.name) {
  cl <- call("lm.special", formula=formula, data=as.name(data.name))
  out <- eval(cl)
  out$call <- cl
  out
}

> lm(Sepal.Length ~ Petal.Length, iris)

Call:
lm(formula = Sepal.Length ~ Petal.Length, data = iris)

Coefficients:
 (Intercept)  Petal.Length  
      4.3066        0.4089  

> lm.special(Sepal.Length ~ Petal.Length, iris)

Call:
lm(formula = formula, data = data)

Coefficients:
 (Intercept)  Petal.Length  
      4.3066        0.4089  

> lm.special2(Sepal.Length ~ Petal.Length, "iris")

Call:
lm.special(formula = Sepal.Length ~ Petal.Length, data = iris)

Coefficients:
 (Intercept)  Petal.Length  
      4.3066        0.4089  

【讨论】:

  • 工作,谢谢,即使是miceadds!虽然我无法解决miceadds 的根本问题,但我今天学到了很多关于call() 的知识。
【解决方案2】:

如果您只想替换特定组件,例如公式:

fit$call$formula <- quote(foo ~ bar)

如果您想以编程方式生成 foo ~ bar,而不是在脚本中硬编码,事情会变得更丑陋...

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多