Terms of a sum in a R expression

旧巷老猫 提交于 2020-01-15 09:28:09

问题


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 in

expression(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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!