如何在R中折叠/合并表达式对象?

时间:2015-07-29 23:06:00

标签: r

想象一下,我通过连接生成一个R expression对象:

x = c(expression({
      a + b
      b + c
      }), 
      expression({
      a + 1
      b + 1
      }))

这会产生一个长度为2的表达式对象:

> x
expression({
    a + b
    b + c
}, {
    a + 1
    b + 1
})

如何将其转换/折叠为单个表达式?也就是说,我正在寻找我可以在x上执行的操作来获得相同的操作:

expression({
    a + b
    b + c
    a + 1
    b + 1
})

4 个答案:

答案 0 :(得分:4)

这似乎有效,每个表达式都应以{

开头
as.expression(sapply(x, function(y) as.list(y[-1])))
# expression(a + b, b + c, a + 1, b + 1)

答案 1 :(得分:3)

这并不要求每个表达式都在class Shape { virtual bool collide(Shape &a) { ... class Circle: public Shape { bool collide(Circle &a) { ... 表达式中的括号中:

x + y

答案 2 :(得分:3)

x = c(expression({
  a + b
  b + c
  }), 
  expression({
  a + 1
  b + 1
  }))

collapsit = function(x) {
    if(!all(sapply(x, class) == "{"))
        stop("I can't collapse non-bracket expressions for you, dawg")

    stuff = unlist(lapply(x[-1], function(y) as.list(y[-1])))
    x[[1]][length(x[[1]])+1:length(stuff)] = stuff
    x[1]
}

res = collapsit(x)
## expression({
##     a + b
##     b + c
##     a + 1
##     b + 1
## })

答案 3 :(得分:2)

这会产生预期的结果,并且可能会按比例扩大以使用reduce或更多的输入。也就是说,我不确定解决方案的,因为我不经常使用表达式。

c_exp = function(x1, x2) {
    parse(text = c("{",
                   tail(head(deparse(x1), -1), -1),
                   head(tail(deparse(x2), -1), -1),
                   "}"))
}

x1 = expression({a+b})
x2 = expression({a + 1})
c_exp(x1, x2)
# expression({
#     a + b
#     a + 1
# })