web-dev-qa-db-fra.com

Comment puis-je concaténer un vecteur?

J'essaie de produire une seule variable qui est une concaténation de deux caractères, par exemple pour passer de "p30s4" "p28s4" à "p30s4 p28s4". J'ai essayé le chat et le collage comme indiqué ci-dessous. Les deux renvoient des variables vides. Qu'est-ce que je fais mal?

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

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

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

Essayez d'utiliser:

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

ou si vous voulez l'espace entre les deux:

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

Une alternative à l'argument 'collapse' de paste (), est d'utiliser do.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 à des fonctions autres que "coller".

10
wkmor1

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

Cependant, pour promouvoir l'idée qu'en cas de doute, vous pouvez écrire votre propre fonction, je 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 n'importe quoi - c'est la version originale que j'ai écrite:

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
}
2
David LeBauer

Le problème avec votre utilisation de cat ci-dessus est que cat(x) écrit x en sortie, pas dans une variable. Si vous vouliez écrire dans une chaîne, vous pourriez faire:

capture.output(cat(blah))

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

1
C8H10N4O2