2012-03-16 8 views
6

Estoy intentando crear expresiones en R concatenando expresiones más pequeñas. Por ejemplo, en S + Puedo hacer esto:¿Cómo puedo concatenar objetos de lenguaje compuesto en R?

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

pero si lo intento en R, me sale esto:

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

[[2]] 
{ 
    d 
    e 
    f 
} 

debería hacer esto de otra manera?

+0

Sí. .................. –

+0

Creo que no tienes suerte aquí Mike. –

Respuesta

7

Los comentarios adjuntos a la respuesta de @ baptiste dejar claro que x y y no son objetos de tipo "expression" (uno de los nueve tipos de vectores básicos utilizados por R). Por lo tanto, no se pueden combinar mediante el uso de c(), ya que podrían ser si fueran de hecho expression vectores.

Si realmente desea combinar objetos de la clase "{" (que se llaman "idioma de los objetos compuestos" en this section de la Definición R Idioma) se podría hacer algo como esto:

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 
} 

Entonces, si se va a hacer esto con frecuencia, puede crear una función que combina un conjunto arbitrario de objetos de la clase "{":

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

¡Funcionó como un encanto! –

0

Creo que una forma es tomar los elementos de x y y. Siempre será el caso de que x[1] es "{}", por lo que podría hacer:

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

aunque imagino que hay una manera más limpia.

2

Ignorando el ejemplo que dio en su pregunta, por el momento,

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

Ahora bien, ¿qué clase de objetos está tratando de concatenar?

+0

hmmm. Más allá de mi conocimiento: ¿es un objeto de tipo "expresión" lo mismo que un objeto de tipo "lenguaje"? –

+0

Hay algo en R/S llamado "expresión" que es un programa no evaluado. Básicamente es una lista (como en Lisp). Quiero tomar dos cortos y combinarlos en uno largo. En Lisp se llamaría '(conc x y)'. No puedo encontrar la función correcta para hacerlo en R. –

+1

@CarlWitthoft '?" Language-class "' parece indicar que '{a; b; c}' es un poco como una 'llamada', excepto que no tiene una 'función' adecuada. Se puede acceder a sus elementos con 'sapply (seq.int (length (x) -1), languageEl, object = x)'. Entonces, en mi débil entendimiento, 'expression' extiende' call', que extiende 'language'. Por lo tanto, 'languageEl (expresión (a, b, c), 2)' también funciona. – baptiste

Cuestiones relacionadas