Existe-t-il une fonction / boucle R qui peut ajouter un numéro ou une chaîne unique à un nom de fichier?

Aug 18 2020

Je suis nouveau sur R et Stack Overflow. J'ai beaucoup cherché une réponse à ma question, et je ne pense pas que ce soit une question répétée.

J'ai des fichiers .csv qui sont chargés dans mon script sous forme de trames de données, et j'ai besoin que ces trames de données soient enregistrées en tant que fichiers .Rda ou .RDS.

La façon dont j'ai écrit le code, les anciens fichiers .Rda seront écrasés dans le répertoire dans lequel je les ai sauvegardés.

base::save(data, file="data.Rda")

Existe-t-il un moyen de créer une boucle qui attache un nombre aléatoire ou une chaîne à un nom de fichier préexistant lors de sa sauvegarde, ou même une fonction qui génère un ID unique? Ce que je recherche, c'est une sortie qui ressemble à

data_1.Rda data_2.Rda data_3.Rda et ainsi de suite où le _ # est généré aléatoirement chaque fois que j'exécute le code.

J'ai essayé de créer un vecteur tel que

x<-c(a, b, c, d, e, f, g, h, i, j, k)

a ensuite créé une boucle pour enregistrer chaque variable individuelle, mais la boucle a simplement enregistré les trames de données sous "a", "b", "c" ... Je veux savoir s'il existe un moyen d'attacher ces variables individuelles à un nom préexistant ("data_a.Rda", "data_b.Rda" ...)

Je ne suis pas particulier sur une méthode tant qu'elle fonctionne.

Réponses

1 AllanCameron Aug 18 2020 at 03:33

Supposons que j'ai un répertoire comme celui-ci:

/Documents (R home)
     |
     |-- my_data
             |
             |--data_1.Rda
             |--data_2.Rda

Ensuite, je peux lister les fichiers dans le my_datarépertoire avec:

list.files(path.expand("~/my_data/"))
#> [1] "data_1.Rda"  "data_2.Rda"

Et je peux générer le chemin du fichier Rda "suivant" avec une fonction simple:

next_rda <- function() {
  f <- list.files(path.expand("~/my_data/"), pattern = "^data_\\d+\\.Rda")
  num <- max(as.numeric(gsub("^data_(\\d)\\.Rda", "\\1", f)) + 1)
  paste0(path.expand("~/my_data/data_"), num, ".Rda")
}

Pour que je puisse faire:

next_rda()
#> [1] "C:/Users/Administrator/Documents/my_data/data_3.Rda"

Cela signifie que si je veux enregistrer un objet, je peux faire:

save(obj, file = next_rda())

Ce qui enregistrera dans le prochain fichier incrémentiel. Puisque la fonction vérifie le répertoire à chaque fois, elle écrit toujours dans un nouveau fichier, numéroté de manière appropriée.

toujames Aug 18 2020 at 03:12

Je vérifierais l'existence du nom de fichier. S'il existe, créez un mécanisme de tri pour créer un nouveau nom de fichier. Que ce soit une chaîne générée aléatoirement ou un système de numérotation.

FYI: Vous pouvez stocker plusieurs variables dans 1 fichier rda en:

> save(data1, data2, data3, file = "data.rda")

pseudospin Aug 18 2020 at 03:19

Jetez un oeil à ?tempfile. Il peut générer des noms de fichiers uniques que vous pouvez utiliser.