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?
x = 5
save(x, file="x.Rda")
x = 7
load("x.Rda")
print(x) # This will print 5. Oops.
x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5
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)
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]]
}
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")
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)
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).
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')
Fichier Rdata avec un objet
assign('newname', get(load('~/oldname.Rdata')))