web-dev-qa-db-fra.com

R - gsub remplaçant les barres obliques inverses

Je voudrais utiliser gsub pour remplacer chaque occurrence d'une barre oblique inverse dans une chaîne par 2 barres obliques inverses.

Actuellement, ce que j'ai essayé, c'est gsub("\\\\", "\\", x). Cela ne semble cependant pas fonctionner. Cependant, si je change l'expression pour remplacer chaque barre oblique inverse par "a", cela fonctionne très bien.

> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"

Le dernier caractère n'est qu'une seule barre oblique inverse; R imprime simplement 2 car il imprime les caractères échappés avec la barre oblique inverse. L'utilisation de nchar confirme que la longueur est 1.

Qu'est-ce qui cause cette fonctionnalité? Le deuxième argument de gsub n'est pas une expression régulière, donc avoir 4 barres obliques inverses dans le littéral de chaîne doit être converti en un caractère avec 2 barres obliques inverses. Il est encore moins logique que le premier appel gsub ci-dessus renvoie une chaîne vide.

17
Jon Claus

Voici ce dont vous avez besoin:

gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"

La raison pour laquelle vous avez besoin de quatre barres obliques inverses pour représenter une barre oblique inverse littérale est que "\" est un caractère d'échappement dans les deux chaînes R et pour le moteur d'expression régulière à laquelle vous passez finalement vos modèles. Si vous parliez directement au moteur d'expression régulière, vous utiliseriez "\\" pour indiquer une barre oblique inverse littérale. Mais pour que R passe "\\" sur le moteur d'expression régulière, vous devez taper "\\\\".


(Si vous souhaitez simplement doubler les barres obliques inverses, vous pouvez utiliser ceci à la place):

gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"
33
Josh O'Brien