2012-03-16 5 views
6

Sto cercando di creare espressioni in R concatenando espressioni più piccole. Per esempio in S + posso fare questo:Come posso concatenare oggetti linguaggio composti in R?

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

ma se provo in R, ottengo questo:

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

[[2]] 
{ 
    d 
    e 
    f 
} 

dovrei fare in un altro modo?

+0

Sì. .................. –

+0

Penso che tu sia sfortunato qui, Mike. –

risposta

7

I commenti allegati alla risposta di @baptiste fanno notare che x e non sono oggetti di tipo "expression" (uno dei nove tipi di vettore di base utilizzati da R). Pertanto, non possono combinare utilizzando c(), come potrebbero se fossero in realtà vettori expression.

Se davvero si vuole combinare gli oggetti della classe "{" (che sono chiamati "oggetti linguaggio composti" in this section della definizione R Lingua) si potrebbe fare qualcosa di simile:

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 
} 

Poi, se si lo faremo frequentemente, potresti creare una funzione che combini un insieme arbitrario di oggetti della classe :

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

Ha funzionato come un fascino! –

0

Penso che un modo sia per afferrare gli elementi di x e . Sarà sempre il caso che x[1] è "{}", in modo che si possa fare:

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

anche se immagino che ci sia un modo più pulito.

2

Ignorando l'esempio che hai dato nella tua domanda, per il momento,

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

Ora, che tipo di oggetti stai cercando di concatenare?

+0

hmmm. Al di là delle mie conoscenze: un oggetto di tipo "espressione" è uguale a un oggetto di tipo "linguaggio"? –

+0

C'è qualcosa in R/S chiamato "espressione" che è un programma non valutato. È fondamentalmente una lista (come in Lisp). Voglio prendere due brevi e combinarli in uno lungo. In Lisp sarebbe chiamato '(conc x y)'. ? Non riesco a trovare la giusta funzione di farlo in R. –

+1

@CarlWitthoft ' "lingua di classe"' sembra indicare che '{a, b, c}' è un po 'come un 'call', salvo che non ha una corretta 'funzione'. È possibile accedere ai suoi elementi con 'sapply (seq.int (length (x) -1), languageEl, object = x)'. Quindi, nella mia debole comprensione, 'expression' estende' call', che estende 'language'. Pertanto, anche 'languageEl (expression (a, b, c), 2)' funziona. – baptiste