2012-03-16 78 views
6

我想通過連接較小的表達式在R中建立表達式。例如,在S +我可以這樣做:如何連接R中的複合語言對象?

> 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

是的。 .................. – 2012-03-16 21:55:01

+0

我認爲你在這裏運氣不佳邁克。 – 2012-03-17 00:21:54

回答

7

附在@ baptiste答案中的註釋使得xy不是"expression"(R使用的九種基本矢量類型之一)的對象。因此,如果它們實際上是expression載體,則它們不能通過使用c()進行組合。

如果你確實想(在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) 
+0

工作就像一個魅力! – 2012-03-17 21:53:39

0

我認爲一種方法是抓住xy的元素。這將永遠是x[1]是這樣的「{}」,那麼你可以做:

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

雖然我想象有一個更清潔的方式。

2

無視你在你暫且問題給的例子,

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

現在,什麼樣的對象是你想串連?

+0

嗯。超出我的理解:是「表達」類型的對象與「語言」類型的對象相同? – 2012-03-16 22:24:37

+0

R/S中有些東西叫做「表達式」,它是一個未評估的程序。它基本上是一個列表(和Lisp一樣)。我想拿兩個短的,並將它們合併成一個長的。在Lisp中,它將被稱爲'(conc x y)'。我無法在R中找到正確的函數。 – 2012-03-16 22:43:18

+1

@CarlWitthoft'?「language-class」'似乎表明'{a; b; c}'有點像'call',除了它沒有適當的'功能'。它的元素可以用'sapply(seq.int(length(x)-1),languageEl,object = x)'來訪問。因此,在我的理解中,'expression'擴展了'call',它擴展了'language'。因此,languageEl(表達式(a,b,c),2)'也適用。 – baptiste 2012-03-16 22:47:36