繁体   English   中英

引用术语列表中的公式

[英]Formula from list of quoted terms

说我有一个引用的术语列表:

l <- list(quote(x), quote(y), quote(I(z + 10)))

我想将其转换为(单面)公式:

~ x + y + I(z + 10)

最简单的方法是将所有内容转换为文本并从头开始构建公式,即进行deparse / reparse:

formula(paste("~", paste(l, collapse="+")))

在幕后相当于

formula(paste("~", paste(sapply(l, deparse), collapse="+")))

但这似乎有点不雅致,并且可能易于解析错误。 有没有一种方法可以通过纯语言操作来获得公式?

通过逐项建立RHS公式,可以以纯粹的符号方式执行此操作。

l <- list(quote(x), quote(y), quote(I(z + 10)))
out <- l[[1]]
for(i in seq_along(l)[-1])
{
    out <- substitute(a + b, list(a=out, b=l[[i]]))
}
out <- call("~", out)
out
# ~x + y + I(z + 10)

请注意, out 看起来像一个公式,但实际上是class(和mode)的call 要将其转换为实际公式,请使用as.formula

f <- as.formula(out)

但是,有时将输出保留为调用对象可能是有利的。 特别是,如果术语数量非常多,则创建公式可能会导致堆栈溢出:

X <- paste0("x", 1:1e5)
X <- lapply(X, as.name)

out <- X[[1]]
for(i in seq_along(X)[-1])
{
    out <- substitute(a + b, list(a=out, b=X[[i]]))
}

# this still works
out <- call("~", out)

f <- as.formula(out)
# Error: protect(): protection stack overflow

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM