2010-03-05 8 views
29

Dans le cadre d'une tâche plus importante effectuée dans R s'exécuter sous Windows, je voudrais copier les fichiers sélectionnés entre les répertoires. Est-il possible de donner à R une commande comme cp patha/filea*.csv pathb (remarquez le caractère générique, pour plus de piquant)?en utilisant R pour copier des fichiers

Répondre

42

Je ne pense pas qu'il y ait annonce façon irecte (timide de shelling-out), mais quelque chose comme le suivant fonctionne habituellement pour moi.

flist <- list.files("patha", "^filea.+[.]csv$", full.names = TRUE) 
file.copy(flist, "pathb") 

Notes:

  • J'ai volontairement décomposé en deux étapes, elles peuvent être combinées.
  • Voir l'expression régulière: R utilise true regex, et sépare également le modèle de fichier du chemin, en deux arguments distincts. Dans la regex - ceci est un gotcha commun, car ils sont implicites aux motifs de type générique, mais requis avec les regex (de peur que certains noms de fichiers ne correspondent au motif générique). mais commencez et/ou terminez avec du texte supplémentaire également sélectionné).
  • Dans le monde Windows, les utilisateurs ajoutent généralement l'argument ignore.case = TRUE à list.files, afin d'émuler le fait que les recherches de répertoire ne tiennent pas compte de la casse avec ce système d'exploitation.
  • La fonction glob2rx() de R fournit un moyen pratique de convertir des motifs génériques en expressions régulières. Par exemple fpattern = glob2rx('filea*.csv') renvoie une regex différente mais équivalente.
+1

Je pense que le modèle devrait être' "filea. + [.] Csv" '. – Marek

+0

@Marek: vous avez raison! En outre, en particulier dans le monde Windows, peopole voudra généralement ajouter l'argument 'ignore.case = TRUE'. J'ai édité en conséquence, merci. – mjv

+0

vous pouvez utiliser? Glob2rx pour convertir des jokers en expressions régulières. –

11

Vous pouvez

  • utilisation system() au feu outre une commande comme si elle était sur la coque, y compris englobement
  • utilisation list.files() alias dir() pour faire le globbing/reg.exp vous correspondant et la copie des fichiers individuellement
  • utilisation file.copy sur des fichiers individuels, comme indiqué dans la réponse de MJV
+0

jamais entendu parler de 'dir'. C'est _ exactement_ identique à 'list.files' ... étrange d'avoir les deux – MichaelChirico

Questions connexes