transformar - ¿Cómo puedo cargar un objeto en un nombre de variable que especifico desde un archivo de datos R?
recodificar variables en r studio (5)
En caso de que alguien esté buscando hacer esto con un archivo fuente simple, en lugar de un archivo Rdata / RDS / Rda guardado, la solución es muy similar a la proporcionada por @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)
Huellas dactilares:
[1] "El valor de arg es 7"
Y en el archivo fuente separado TestSourceFile.R
myTestFunction = function(arg) {
print(paste0("Value of arg is ", arg))
}
De nuevo, esta solución solo funciona si hay exactamente un archivo, si hay más, entonces solo devolverá uno de ellos (probablemente el primero, pero eso no está garantizado).
Cuando guarda una variable en un archivo de datos R utilizando save
, se guarda con el nombre que tenía en la sesión que lo guardó. Cuando más tarde vaya a cargarlo desde otra sesión, se carga con el mismo nombre, que el script de carga no puede saber. Este nombre podría sobrescribir una variable existente del mismo nombre en la sesión de carga. ¿Hay alguna forma de cargar de forma segura un objeto desde un archivo de datos a un nombre de variable especificado sin riesgo de dañar las variables existentes?
Ejemplo:
Guardar sesión:
x = 5
save(x, file="x.Rda")
Cargando la sesión:
x = 7
load("x.Rda")
print(x) # This will print 5. Oops.
Cómo quiero que funcione:
x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5
Puede crear un nuevo entorno, cargar el archivo .rda en ese entorno y recuperar el objeto desde allí. Sin embargo, esto impone algunas restricciones: o bien sabe cuál es el nombre original de su objeto, o solo hay un objeto guardado en el archivo.
Esta función devuelve un objeto cargado desde un archivo .rda proporcionado. Si hay más de un objeto en el archivo, se devuelve uno arbitrario.
load_obj <- function(f)
{
env <- new.env()
nm <- load(f, env)[1]
env[[nm]]
}
Si solo está guardando un solo objeto, no use un archivo .Rdata
, use un archivo .RDS
:
x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)
También puedes probar algo como:
# 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)
Yo uso lo siguiente:
loadRData <- function(fileName){
#loads an RData file, and returns it
load(fileName)
get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")