118 votes

Puis-je charger un objet R enregistré dans un nouveau nom d'objet ?

Lorsque vous enregistrez une variable dans un fichier de données R à l'aide de la fonction save il est enregistré sous le nom qu'il portait dans la session qui l'a enregistré. Lorsque je la charge ultérieurement à partir d'une autre session, elle est chargée avec le même nom, que le script qui la charge ne peut pas connaître. Ce nom pourrait écraser une variable existante du même nom dans la session de chargement. Existe-t-il un moyen de charger en toute sécurité un objet à partir d'un fichier de données dans un nom de variable spécifié sans risquer d'écraser les variables existantes ?

Exemple :

Sauvegarde de la session :

x = 5
save(x, file="x.Rda")

Chargement de la session :

x = 7
load("x.Rda")
print(x) # This will print 5. Oops.

Comment je veux que cela fonctionne :

x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5

3voto

Javier Acosta Points 41

Fichier Rdata avec un objet

assign('newname', get(load('~/oldname.Rdata')))

2voto

user2711915 Points 397

Au cas où quelqu'un voudrait faire cela avec un simple fichier source, plutôt qu'avec un fichier Rdata/RDS/Rda sauvegardé, la solution est très similaire à celle fournie par @Hong Ooi.

load_obj <- function(fileName) {

  local_env = new.env()
  source(file = fileName, local = local_env)

  return(local_env[[names(local_env)[1]]])

}

my_loaded_obj = load_obj(fileName = "TestSourceFile.R")

my_loaded_obj(7)

Impressions :

[1] "Value of arg is 7"

Et dans le fichier source séparé TestSourceFile.R

myTestFunction = function(arg) {
  print(paste0("Value of arg is ", arg))
}

Encore une fois, cette solution ne fonctionne que s'il y a exactement un fichier, s'il y en a plusieurs, elle ne renverra que l'un d'entre eux (probablement le premier, mais ce n'est pas garanti).

1voto

SeanM Points 65

J'élargis la réponse de @ricardo pour permettre la sélection d'une variable spécifique si l'option .Rdata contient plusieurs variables (car mes crédits sont faibles pour éditer une réponse). Il ajoute quelques lignes pour lire les données de l'utilisateur après avoir listé les variables contenues dans le fichier .Rdata fichier.

loadRData <- function(fileName) {
  #loads an RData file, and returns it
  load(fileName)
  print(ls())
  n <- readline(prompt="Which variable to load? \n")
  get(ls()[as.integer(n)])
}

select_var <- loadRData('Multiple_variables.Rdata')

0voto

rwb Points 640

Suite à @ricardo, un autre exemple d'utilisation (effective) d'un environnement séparé

load_rdata <- function(file_path) {
    res <- local({
        load(file_path)
        return(get(ls()))
    })
    return(res)
}

Mises en garde similaires, mais ne s'attend à ce qu'un seul objet soit renvoyé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X