如何在R中连接复合语言对象?

时间:2012-03-16 21:25:58

标签: r

我试图通过连接较小的表达式在R中构建表达式。例如,在S +中我可以这样做:

> x = substitute({a;b;c})
> y = substitute({d;e;f})
> c(x,y)
{
    a
    b
    c
    d
    e
    f
}

但如果我在R中尝试,我会得到这个:

> c(x,y)
[[1]]
{
    a
    b
    c
}

[[2]]
{
    d
    e
    f
}

我应该采取另一种方式吗?

3 个答案:

答案 0 :(得分:7)

@ baptiste的答案附带的评论指出xy不是"expression"类型的对象(R使用的九种基本向量类型之一)。因此,如果它们实际上是c()向量,则不能通过使用expression进行组合。

如果你确实想要组合类"{"的对象(在R语言定义的this section中称为“复合语言对象”),你可以这样做:

x <- substitute({a;b;c})
y <- substitute({d;e;f})
class(x)
# [1] "{"

as.call(c(as.symbol("{"), c(as.list(x)[-1], as.list(y)[-1])))
{
    a
    b
    c
    d
    e
    f
}

然后,如果您经常这样做,您可以创建一个组合了"{"类的任意对象集的函数:

myC <- function(...) {
    ll <- list(...)
    ll <- lapply(ll, function(X) as.list(X)[-1])
    ll <- do.call("c", ll)
    as.call(c(as.symbol("{"), ll))
}

# Try it out
myC(x, y, y, y, x)

答案 1 :(得分:2)

暂时忽略您在问题中提供的示例

x = expression(a,b,c)
y = expression(d,e,f)
c(x,y)

现在,你试图连接什么类型的对象?

答案 2 :(得分:0)

我认为一种方法是获取xy的元素。 x[1]是“{}”的情况总是如此,所以你可以这样做:

 x[(length(x)+1):(length(x)+length(y)-1)] <- y[2:(length(y))]  

虽然我认为有一种更清洁的方式。