我试图通过连接较小的表达式在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
}
我应该采取另一种方式吗?
答案 0 :(得分:7)
@ baptiste的答案附带的评论指出x
和y
不是"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)
我认为一种方法是获取x
和y
的元素。 x[1]
是“{}”的情况总是如此,所以你可以这样做:
x[(length(x)+1):(length(x)+length(y)-1)] <- y[2:(length(y))]
虽然我认为有一种更清洁的方式。