R: 动态更新公式

4

我该如何动态更新一个公式?

例如:

myvar <- "x"

update(y ~ 1 + x, ~ . -x)
# y ~ 1 (works as intended)

update(y ~ 1 + x, ~ . -myvar)
# y ~ x (doesn't work as intended)

update(y ~ 1 + x, ~ . -eval(myvar))
# y ~ x (doesn't work as intended)
1个回答

4
您可以在update()调用中使用paste()
myvar <- "x"
update(y ~ 1 + x, paste(" ~ . -", myvar))
# y ~ 1

编辑

正如 @A.Fischer 在评论中指出的那样,如果 myvar 是一个长度大于1的向量,则此方法无效。

myvar <- c("k", "l")
update(y ~ 1 + k + l + m, paste(" ~ . -", myvar))
# y ~ l + m
# Warning message:
# Using formula(x) is deprecated when x is a character vector of length > 1.
#   Consider formula(paste(x, collapse = " ")) instead.

只有 "k" 被删除了,但 "l" 仍然保留在公式中。

在这种情况下,我们可以将公式转换为字符串,添加/删除我们想要更改的内容,并使用 reformulate 重新构建公式,类似于:

FUN <- function(fo, x, negate=FALSE) {
  foc <- as.character(fo)
  s <- el(strsplit(foc[3], " + ", fixed=T))
  if (negate) {
    reformulate(s[!s %in% x], foc[2], env=.GlobalEnv)
  } else {
    reformulate(c(s, x), foc[2], env=.GlobalEnv)
  }
}

fo <- y ~ 1 + k + l + m

FUN(fo, c("n", "o"))  ## add variables
# y ~ 1 + k + l + m + n + o
FUN(fo, c("k", "l"), negate=TRUE))  ## remove variables
# y ~ 1 + m

1
请注意,从 R 4.0 开始,如果“myvar”是字符向量,则上述代码将返回错误。有关可能的解决方法,请参见此处:https://stackoverflow.com/questions/65530492/dynamically-update-formula-with-vector-under-r-4-0-0-and-higher - A.Fischer
@A.Fischer 你在说什么?我在 R 4.0.3 和 R 4.0.0 中都测试过这段代码(出于好奇心),对我来说它运行良好。 - jay.sf
我在谈论的情况是,当myvar是一个字符向量而不是上面所述的字符标量时。例如,如果你有myvar <- c("x", "y"),那么在R 4.0及更高版本中,上面的代码应该会失败。 - A.Fischer
@A.Fischer 哦,你是指长度大于1的字符向量。谢谢!请看编辑。 - jay.sf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接