如何更新条件公式?

How to update a conditional formula?

让我直接进入示例。考虑以下等式:

 frml <- formula(y ~ a + b | x + z )

使用了这样的公式规范,例如AER::ivreg.

我想更新此公式,使其显示为

 frml2 <- y ~ a + b + c | x + z + w

但是,我不确定如何分别更新条件符号|前后的部分。例如,

 frml2 <- update.formula(frml, . ~ . + c | . + w)

给予

 y ~ ((a + b | x + z) + c | (a + b | x + z) + w)

这不是我想要的。问题是 . 指的是右侧(或左侧)的整个公式,包括条件。有谁知道如何相应地更新公式?

一种方法似乎是将公式转换为字符向量,在 | 处拆分向量,添加我想添加的任何内容,然后将公式重新组合在一起。虽然这很容易,但我觉得一定有更简单的方法来做到这一点。我肯定不是第一个处理此类问题的人。任何建议/提示/评论将不胜感激!

不能从你的问题中确定你是否不能使用一个包,因为 Formula 包有一个功能就是为了这个。它 类 它的对象既是 formula 又是 Formula:

> library(Formula)
> frml <- Formula(y ~ a + b | x + z )
> update(frml, . ~ . + c | . + w)
y ~ a + b + c | x + z + w
> class(frml)
[1] "Formula" "formula"

这是不需要外部包的方法。它使用公式的结构:

 frml[[3]][[2]] <- quote(a+b+c)
 frml[[3]][[3]] <- quote(x + z + w)
 frml
#y ~ a + b + c | x + z + w

虽然以中缀形式显示,但公式对象的存储使用 R 函数和列表。公式的第一个组成部分(与任何函数调用的组成部分一样)是“~”,第二个是 LHS 表达式,第三个是 RHS。同样,在这种情况下,RHS 的结构也与第一个元素 "|" 类似,因为 "|" 是具有两个参数的逻辑函数。所以你想定位对象的第三个元素的第二个和第三个元素。所以它们是 frml[[3]][[2]]frml[[3]][[3]]。您需要传入 quote 函数执行的语言值。公式对象也可以用更“功能”的版本来表达:

 identical(frml,   # after the mods
            `~`(y, `|`(a + b + c, x + z + w)),
            ignore.environment=TRUE)
#[1] TRUE