web-dev-qa-db-fra.com

R: Comment remplacer l'espace ('') dans la chaîne par une * unique * barre oblique inversée et un espace ('\')

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:

  • Comment atteindre mon objectif de remplacer un ' ' par un '\ '?
  • Pourquoi les variantes de nombres impairs avec barres obliques des remplacements ont-elles échoué, alors que les substitutions de nombres pairs avec barres obliques ont fonctionné?

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.

9
user3897315

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
13
Tim Biegeleisen

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.

0
D. Woods