Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 引用术语表中的公式_R_Formula - Fatal编程技术网

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