问题
Given a R expression which represents a sum of terms like
expr <- expression(a + b * c + d + e * f)
I would like to retrieve the set of all the terms of the sum as a list
of names or expressions. So in the example, the elements would be: a
, b * c
, d
and e * f
.
The following comes from a comment.
The tems could themselves contain a
+
operator as inexpression(a + b * c + d + e * (f + g))
so we need some understanding of the R language.
Is there a simple way to proceed e.g., using call_tree
of the pryr package?
回答1:
You can use a recursive function to crawl the parse tree:
foo <- function(x) {
if (is.call(x)) y <- as.list(x) else return(x)
#stop crawling if not a call to `+`
if (y[[1]] != quote(`+`)) return(x)
y <- lapply(y, foo)
return(y[-1]) #omit `+` symbol
}
expr1 <- expression(a + b * c + d + e * f)
unlist(foo(expr1[[1]]))
#[[1]]
#a
#
#[[2]]
#b * c
#
#[[3]]
#d
#
#[[4]]
#e * f
expr2 <- expression(a + b * c + d + e * (f + g))
unlist(foo(expr2[[1]]))
#[[1]]
#a
#
#[[2]]
#b * c
#
#[[3]]
#d
#
#[[4]]
#e * (f + g)
回答2:
Try recursively parsing the expression:
getTerms <- function(e, x = list()) {
if (is.symbol(e)) c(e, x)
else if (identical(e[[1]], as.name("+"))) Recall(e[[2]], c(e[[3]], x))
else c(e, x)
}
expr <- expression(a + b * c + d + e * (f + g))
getTerms(expr[[1]])
giving:
[[1]]
a
[[2]]
b * c
[[3]]
d
[[4]]
e * (f + g)
来源:https://stackoverflow.com/questions/53300717/terms-of-a-sum-in-a-r-expression