web-dev-qa-db-fra.com

Comment charger un objet dans un nom de variable que je spécifie à partir d'un fichier de données R?

Lorsque vous enregistrez une variable dans un fichier de données R à l'aide de save, celle-ci est enregistrée sous le nom de la session qui l'a enregistrée. Plus tard, lorsque je vais le charger à partir d'une autre session, il est chargé avec le même nom, ce que le script de chargement 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 d'un fichier de données dans un nom de variable spécifié sans risquer d'empiéter sur les variables existantes?

Exemple:

Session de sauvegarde:

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

Session de chargement:

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
79
Ryan Thompson

Si vous enregistrez un seul objet, n'utilisez pas un fichier .Rdata, utilisez un fichier .RDS:

x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)
77
hadley

Vous pouvez créer un nouvel environnement, charger le fichier .rda dans cet environnement et récupérer l'objet à partir de là. Toutefois, cela impose certaines restrictions: vous connaissez le nom d'origine de votre objet ou un seul objet est enregistré dans le fichier.

Cette fonction retourne un objet chargé à partir d'un fichier .rda fourni. S'il y a plus d'un objet dans le fichier, un objet arbitraire est renvoyé.

load_obj <- function(f)
{
    env <- new.env()
    nm <- load(f, env)[1]
    env[[nm]]
}
30
Hong Ooi

J'utilise les éléments suivants:

loadRData <- function(fileName){
#loads an RData file, and returns it
    load(fileName)
    get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")
23
ricardo

Vous pouvez aussi essayer quelque chose comme:

# Load the data, and store the name of the loaded object in x
x = load('data.Rsave')
# Get the object by its name
y = get(x)
# Remove the old object since you've stored it in y 
rm(x)
21
by0

Au cas où quelqu'un voudrait le faire avec un fichier source simple, plutôt qu'un fichier Rdata/RDS/Rda enregistré, 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] "La valeur de arg est 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 ya exactement un fichier, s’il y en a plusieurs, puis renverra l’un d’eux (probablement le premier, mais ce n’est pas garanti).

1
user2711915

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

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')
0
SeanM

Fichier Rdata avec un objet

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