R 引用术语表中的公式
假设我有一个引用术语列表:R 引用术语表中的公式,r,formula,R,Formula,假设我有一个引用术语列表: l <- list(quote(x), quote(y), quote(I(z + 10))) 最简单的方法是将所有内容转换为文本,从头开始构建公式,即,去粗化/重分析: formula(paste("~", paste(l, collapse="+"))) 在幕后,这相当于 formula(paste("~", paste(sapply(l, deparse), collapse="+"))) 但这似乎有点不雅观,而且可能容易出错。有没有一种方法可以通过
l <- list(quote(x), quote(y), quote(I(z + 10)))
最简单的方法是将所有内容转换为文本,从头开始构建公式,即,去粗化/重分析:
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)
然而,有时将输出作为调用对象是有利的。特别是,如果术语数量非常大,则创建公式可能会导致堆栈溢出:
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
X您不需要使用quote
和deparse
来构造公式。也许您可以尝试公式(paste0(“~”,paste0(l,collapse=“+”))
@mamounbenghzal请注意,您也在对列表进行去parse,尽管确实不需要直接调用去parse
。
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