utilisation de R pour copier des fichiers

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

30
demandé sur MichaelChirico 2010-03-05 07:10:08

2 réponses

Je ne pense pas qu'il y ait un moyen direct (timide de shelling-out), mais quelque chose comme ce qui suit fonctionne habituellement pour moi.

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

Notes:

  • Je volontairement décomposé en deux étapes, ils peuvent être combinés.
  • voir l'expression régulière: R utilise une expression rationnelle vraie, et sépare également le modèle de fichier du chemin, dans deux arguments distincts.
  • notez les ^ et $ (beg/end of string) dans la regex - c'est un gotcha commun, car ceux-ci sont implicites pour les modèles de type générique, mais requis avec des expressions rationnelles (de peur que certains noms de fichiers qui correspondent au modèle générique mais commencent et / ou se terminent par du texte supplémentaire soient également sélectionnés).
  • dans le monde Windows, les gens ajouteront généralement l'argument ignore.case = TRUE à list.files, afin d'émuler le fait que les recherches dans les répertoires sont insensibles à 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 un regex différent mais équivalent.
44
répondu mjv 2016-08-30 00:21:50

Vous pouvez

  • Utilisez system() pour déclencher une commande comme si elle était sur le shell, y compris globbing
  • utiliser list.files() aka dir() pour faire le globbing / reg.exp correspondant à vous-même et la copie des fichiers individuellement
  • Utilisez file.copy sur des fichiers individuels comme indiqué dans la réponse de mjv
11
répondu Dirk Eddelbuettel 2010-03-05 04:53:13