J'ai cherché à plusieurs reprises et je n'ai pas trouvé de réponse ici ni ailleurs. Je veux remplacer chaque espace ' '
dans les variables contenant des noms de fichier par un '\ '
. (Un cas d'utilisation pourrait concerner les commandes Shell, avec les espaces insérés, afin que chaque nom de fichier n'apparaisse pas sous forme de liste d'arguments.) J'ai parcouru la question StackOverflow "Comment remplacer une seule barre oblique inversée dans R" et découvrez que de nombreuses combinaisons fonctionnent comme indiqué:
> gsub(" ", "\\\\", "a b")
[1] "a\\b"
> gsub(" ", "\\ ", "a b", fixed = TRUE)
[1] "a\\ b"
mais essayez-les avec une version à une seule barre oblique et R l’ignore:
> gsub(" ", "\\ ", "a b")
[1] "a b"
> gsub(" ", "\ ", "a b", fixed = TRUE)
[1] "a b"
Pour le cas allant dans le sens opposé - supprimer les barres obliques d'une chaîne, cela fonctionne pour deux:
> gsub("\\\\", " ", "a\\b")
[1] "a b"
> gsub("\\", " ", "a\\b", fixed = TRUE)
[1] "a b"
Cependant, pour les slash simples, certaines perversités internes dans R m'empêchent même de tenter de les supprimer:
> gsub("\\", " ", "a\\b")
Error in gsub("\\", " ", "a\\b") :
invalid regular expression '\', reason 'Trailing backslash'
> gsub("\", " ", "a\b", fixed = TRUE)
Error: unexpected string constant in "gsub("\", " ", ""
L'expression régulière non valide nous dit quelque chose, mais je ne vois pas quoi. (Notez aussi que l'option Perl = True
ne vous aide pas.)
Même avec trois barres obliques inverses, R ne parvient pas à en remarquer une seule:
> gsub(" ", "\\\ ", "a b")
[1] "a b"
Le bagout s'étend aussi! Même des multiples de deux travaux:
> gsub(" ", "\\\\\\\\", "a b")
[1] "a\\\\b"
mais pas des multiples impairs (devrait obtenir '\\\ '
:
> gsub(" ", "\\\\\\ ", "a b")
[1] "a\\ b"
> gsub(" ", "\\\ ", "a b", fixed = TRUE)
[1] "a\\ b"
(Je m'attendrais à 3 barres obliques, pas deux.)
Mes deux questions sont:
' '
par un '\ '
?Pour les commandes Shell, une solution simple consiste à citer les noms de fichiers, mais une partie de mon intérêt est simplement de comprendre ce qui se passe avec le moteur de regex de R.
Préparez-vous pour un visage-Palm, parce que ceci:
> gsub(" ", "\\\ ", "a b", fixed = TRUE)
[1] "a\\ b"
travaille réellement.
Les deux barres obliques inverses que vous voyez ne sont que la manière dont la console R affiche une seule barre oblique inversée, qui est échappée lors de l’impression à l’écran.
Pour confirmer que le remplacement par une simple barre oblique inverse fonctionne, essayez d'écrire la sortie dans un fichier texte et vérifiez vous-même:
f <- file("C:\\output.txt")
writeLines(gsub(" ", "\\", "a b", fixed = TRUE), f)
close(f)
Dans output.txt
, vous devriez voir ce qui suit:
a\b
Discussion très utile! (Cela fait deux jours que je cherche sur Google.)
Une autre façon de voir la différence (plutôt que d'écrire dans un fichier) consiste à comparer le contenu de la chaîne à l'aide de print
et cat
.
z <- gsub(" ", "\\", "a b", fixed = TRUE)
> print(z)
[1] "a\\ b"
> cat(z)
a\ b
Donc, en utilisant cat
au lieu de print
, nous pouvons confirmer que la ligne gsub
accomplit ce qui était prévu pour nous lorsque nous essayons d'ajouter des barres obliques inverses uniques à une chaîne.