2012-03-16 5 views
6

小さな式を連結してRで式を構築しようとしています。Rでどのように複合言語オブジェクトを連結できますか?

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

を私はRでそれをしようとした場合、私はこれを取得::Sの+の例では、私はこれを行うことができます

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

[[2]] 
{ 
    d 
    e 
    f 
} 

が、私はこの別の方法でやるべきことを?

+0

はい:頻繁にこれをやっているつもりだった、あなたはクラス"{"のオブジェクトの任意のセットを組み合わせた機能を作成することができます。 .................. –

+0

あなたはここで運が悪いと思います。マイク。 –

答えて

7

コメントはxyはタイプ"expression"(Rによって使用される9つの基本的なベクトル型のいずれか)のオブジェクトではありませんというポイントを作ります。したがって、実際には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

チャームのように働いた! –

0

私は1つの方法は、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

hmmm。私の知識を超えて:タイプ "表現"のオブジェクトは、タイプ "言語"のオブジェクトと同じですか? –

+0

R/Sには評価されていないプログラムである「表現」と呼ばれるものがあります。これは基本的には(Lispのような)リストです。私は2つの短いものを1つの長いものに結合したい。 Lispでは '(conc x y)'と呼ばれるでしょう。私はRの中でそれを行う正しい関数を見つけることができません。 –

+1

@CarlWitthoft '?" language-class "は' {a; b; c} 'が' call'のようなビットであることを示すようです適切な「機能」を持たない。その要素は 'sapply(seq.int(length(x)-1)、languageEl、object = x)'でアクセスできます。だから私の微妙な理解では、 '式'は 'call'を拡張して' language'を拡張します。したがって、 'languageEl(式(a、b、c)、2)'も動作します。 – baptiste

関連する問題