2010-05-02 14 views
29

J'essaie de produire une seule variable qui est une concaténation de deux caractères, par exemple passer de "p30s4" "p28s4" à "p30s4 p28s4". J'ai essayé chat et coller comme indiqué ci-dessous. Les deux retournent des variables vides. Qu'est-ce que je fais mal?R: comment concaténer un vecteur?

> blah = c("p30s4","p28s4") 
> blah 
[1] "p30s4" "p28s4" 

> foo = cat(blah) 
p30s4 p28s4 
> foo 
NULL 

> foo = paste(cat(blah)) 
p30s4 p28s4 
> foo 
character(0) 
+0

vous concaténer un vecteur, vous voudrez peut-être changer la question, mais la réponse est quand même correcte – Dan

Répondre

52

Essayez d'utiliser:

> paste(blah, collapse = "") 
[1] "p30s4p28s4" 

ou si vous voulez l'espace entre:

> paste(blah, collapse = " ") 
[1] "p30s4 p28s4" 
10

Une alternative à l'argument de la 'effondrement' de la pâte(), est d'utiliser faire .call() pour passer chaque valeur du vecteur comme argument.

do.call(paste,as.list(blah)) 

L'avantage est que cette approche est généralisable à d'autres fonctions que 'coller'.

+0

'as.list (blah)' a fait l'affaire pour moi –

2

Les réponses à cette question sont excellentes, et beaucoup plus simples que les miennes - j'ai donc adopté l'utilisation de 'collapse'.

Cependant, pour promouvoir l'idée que dans le doute, vous pouvez écrire votre propre fonction, je vous présente ma précédente, solution moins élégante:

vecpaste <- function (x) { 
    y <- x[1] 
    if (length(x) > 1) { 
     for (i in 2:length(x)) { 
      history 
      y <- paste(y, x[i], sep = "") 
     } 
    } 
    #y <- paste(y, "'", sep = "") 
    y 
} 

vecpaste(blah) 

vous pouvez également ajouter des guillemets et des virgules, ou à peu près tout - c'est la version originale que j'ai écrit:

vecpaste <- function (x) { 
y <- paste("'", x[1], sep = "") 
if (length(x) > 1) { 
    for (i in 2:length(x)) { 
     history 
     y <- paste(y, x[i], sep = "") 
    } 
} 
y <- paste(y, "'", sep = "") 
y 
} 
1

le problème avec votre utilisation de cat ci-dessus est que cat(x) écrit x à la sortie, et non à une variable. Si vous vouliez écrire une chaîne, vous pouvez faire:

capture.output(cat(blah)) 

qui, comme son nom l'indique, capture la sortie d'une chaîne pour revenir le résultat souhaité. Cependant, c'est pas la méthode préférée, juste une explication au moyen d'une solution alternative.

Questions connexes