web-dev-qa-db-fra.com

Chaînes de texte brut pour les chemins de fichiers dans R

Est-il possible d'utiliser un préfixe lors de la spécification d'une chaîne de chemin de fichier dans R pour ignorer les caractères d'échappement?

Par exemple, si je veux lire le fichier example.csv lors de l’utilisation de Windows, je dois modifier manuellement \ en / ou \\. Par exemple,

'E:\DATA\example.csv'

devient

'E:/DATA/example.csv'

data <- read.csv('E:/DATA/example.csv')

Dans python, je peux préfixer ma chaîne en utilisant r pour éviter de procéder de la sorte (par exemple, r'E:\DATA\example.csv'). Existe-t-il une commande similaire dans R ou une approche que je peux utiliser pour éviter ce problème? (Je me déplace entre Windows, Mac et Linux - c'est évidemment un problème sur le système d'exploitation Windows).

26
djq

Vous pouvez utiliser file.path pour construire le chemin de fichier correct, indépendamment du système d'exploitation.

file.path("E:", "DATA", "example.csv")
[1] "E:/DATA/example.csv"

Il est également possible de convertir un chemin de fichier au format canonique de votre système d'exploitation à l'aide de normalizePath:

zz <- file.path("E:", "DATA", "example.csv")
normalizePath(zz)
[1] "E:\\DATA\\example.csv"

Mais en réponse directe à votre question: je ne suis pas au courant d'un moyen d'ignorer la séquence d'échappement en utilisant R. En d'autres termes, je ne pense pas qu'il soit possible de copier un chemin de fichier à partir de Windows et de le coller directement dans R.

Cependant, si vous recherchez vraiment un moyen de copier-coller à partir du Presse-papiers Windows et d'obtenir une chaîne R valide, essayez readClipboard

Par exemple, si je copie un chemin de fichier à partir de l'Explorateur Windows, puis exécutez le code suivant, j'obtiens un chemin de fichier valide:

zz <- readClipboard()
zz
[1] "C:\\Users\\Andrie\\R\\win-library\\"
37
Andrie

1) Si E:\DATA\example.csv est dans le presse-papier, procédez comme suit:

example.csv <- scan("clipboard", what = "")
## Read 1 item
example.csv
## [1] "E:\\DATA\\example.csv"

Vous pouvez maintenant copier "E:\\DATA\\example.csv" de la sortie ci-dessus dans le presse-papiers, puis le coller dans votre code source si vous avez besoin de coder en dur le chemin. 

Des remarques similaires s'appliquent si E:\DATA\example.csv est dans un fichier.

2) Si le fichier existe, essayez une autre chose:

example.csv <- file.choose()

puis naviguez jusqu'à elle et continuez comme indiqué en 1) ci-dessus (sauf que la ligne file.choose remplace l'instruction scan dans cette case).

3) Notez que ce n’est pas vrai que vous devez changer les barres obliques inverses pour des barres obliques pour read.csv sous Windows, mais si, pour une raison quelconque, vous devez réellement faire cette traduction, alors si le fichier existe, cela traduira les barres obliques inverses n’existe pas, il vous donnera un avertissement gênant, vous voudrez peut-être utiliser l’une des approches ci-dessous):

normalizePath(example.csv, winslash = "/")

et ceux-ci traduisent des barres obliques inverses pour faire suivre des barres obliques même si le fichier n'existe pas:

gsub("\\", "/", example.csv, fixed = TRUE)
## [1] "E:/DATA/example.csv"

ou

chartr("\\", "/", example.csv)
## [1] "E:/DATA/example.csv"

EDIT: Ajout de plus d’informations sur normalizePath.

7
G. Grothendieck

Une approche légèrement différente que j'utilise avec une fonction personnalisée qui prend un chemin Windows et le corrige pour R.

pathPrep <- function() {                        
    cat("Please enter the path:\\n\\n")         
    oldstring <- readline()                     
    chartr("\\\\", "/", oldstring)              
}                                               

Essayons-le!

Lorsque vous y êtes invité, collez le chemin dans la console ou utilisez ctrl + r sur tout en même temps. 

(x <- pathPrep())                      
C:/Users/Me/Desktop/SomeFolder/example.csv      

Maintenant, vous pouvez le nourrir à une fonction

Shell.exec(x) #this piece would work only if    
              #  this file really exists in the 
              #  location specified  

Mais comme d'autres l'ont souligné, ce que vous voulez n'est pas vraiment possible.

4
Tyler Rinker

Non, ce n'est pas possible. Pardon.

2
Michael Hoffman

Voici un hack d'une ligne incroyablement moche à faire en base R, sans paquet nécessaire:

setwd(gsub(", ", "", toString(paste0(read.table("clipboard", sep="\\", stringsAsFactors=F)[1,], sep="/"))))

Utilisable dans sa propre petite fonction wrapper ainsi (en utilisant suppressWarnings pour la tranquillité d'esprit):

> getwd()
[1] "C:/Users/username1/Documents"
> change_wd=function(){
+   suppressWarnings(setwd(gsub(", ", "", toString(paste0(read.table("clipboard", sep="\\", stringsAsFactors=F)[1,], sep="/")))))
+   getwd()
+ }

Maintenant vous pouvez le lancer:

#Copy your new folder path to clipboard
> change_wd()
[1] "C:/Users/username1/Documents/New Folder"
2
Matt

Pour répondre à la question "Est-ce que je peux analyser raw-string dans R sans avoir à double échapper les barres obliques inverses?" ce qui est une bonne question, et a beaucoup d'utilisations en plus du cas d'utilisation spécifique avec le presse-papiers. 

J'ai trouvé un paquet qui semble fournir cette fonctionnalité: 

https://github.com/trinker/pathr

Voir "win_fix". Le cas d'utilisation spécifié dans la documentation est exactement le cas d'utilisation que vous venez de décrire, mais je n'ai pas encore cherché à savoir s'il gère des scénarios d'utilisation plus souples.

0
Matthew Strasiotto