2017-06-23 1 views
2

J'ai un vecteur de noms, comme celui-ci:Centrer le texte dans une chaîne de largeur fixe en ajoutant les espaces de suivi

x <- c("Marco", "John", "Jonathan") 

je dois le formater afin que les noms se centrer dans les chaînes 10 caractères , en ajoutant des espaces avant et arrière:

> output 
# [1] " Marco " " John " " Jonathan " 

J'espérais une solution moins compliquée que d'aller avec paste, rep et compter nchar? (peut-être avec sprintf mais je ne sais pas comment).

+2

Voici un complexe un: 'pâte (sapply (nchar (x), fonction (n) pâte (représentant (» », étage ((10 - n)/2)), collapse = "")), x, spply (nchar (x), fonction (n) coller (rep ("", 10 - n - floor ((10 - n)/2)), collapse = "")), sep = "") ' –

+1

@db merci, votre solution fonctionne en effet (sauf lorsque les noms initiaux dépassent 10 caractères elle jette une erreur). – agenis

Répondre

3

Voici une solution sprintf() qui utilise un simple vecteur auxiliaire f pour déterminer les largeurs de côté faible. Nous pouvons ensuite insérer les largeurs dans notre format en utilisant le caractère *, en prenant le ceiling() sur le côté droit pour tenir compte d'un nombre impair de caractères dans un nom. Puisque la largeur maximale de notre caractère est de 10, chaque nom qui dépasse 10 caractères restera inchangé car nous ajustons ces largeurs avec pmax().

f <- pmax((10 - nchar(x))/2, 0) 

sprintf("%-*s%s%*s", f, "", x, ceiling(f), "") 
# [1] " Marco " " John " " Jonathan " "Christopher" 

données:

x <- c("Marco", "John", "Jonathan", "Christopher")