2016-01-21 7 views
1

Это очень простой (и я подозреваю, что это было задано в другом месте, хотя и не совсем here).R, назначить контент с объекта .rda с load()

У меня есть огромное количество файлов .rda, каждый с одним фреймом данных. Я хотел бы делать вычисления на каждом кадре данных и, следовательно, загружать их (load()). Если бы они были .RDS приемлю я бы что-то вроде:

#My data 
x <- data.frame(a=1:3) 
y <- data.frame(a=3:6) 

#Save as RDS 
saveRDS(x, file = "x.rds") 
saveRDS(y, file = "y.rds") 

files <- c("x.rds", "y.rds") 
data <- lapply(files, readRDS) 

#Do something with the data in the list "data" 

Как я могу сделать подобную вещь с помощью load, так как это вы не можете назначить данные - только имя - переменной:

x <- data.frame(a=1:3) 

> x 
    a 
1 1 
2 2 
3 3 

save(x, file= "x.rda") 
x <- load("x.rda") 

> x 
[1] "x" 

ответ

1

Если вы уверены, что все файлы содержат только один объект, вы могли бы взять Преимущество envir аргумента load в функции-оболочки, как это:

load_object <- function(file) { 
    tmp <- new.env() 
    load(file = file, envir = tmp) 
    tmp[[ls(tmp)[1]]] 
} 

Использование будет выглядеть следующим образом:

not_x <- data.frame(xx = 1:5) 
save(not_x, file = "~/tmp/x.Rdata") 

(x <- load_object("~/tmp/x.Rdata")) 
# xx 
#1 1 
#2 2 
#3 3 
#4 4 
#5 5 

all.equal(not_x, x) 
#[1] TRUE 
0

вы хотите использовать базовую get функции с чем-то вроде:

> # My data 
> x <- data.frame(a=1:3) 
> y <- data.frame(a=4:6) 

> # Save as RDA 
> save(x, file = "x.rda") 
> save(y, file = "y.rda") 

> files <- c("x.rda", "y.rda") 
> data <- lapply(lapply(files, load), get) 

> data 
[[1]] 
    a 
1 1 
2 2 
3 3 

[[2]] 
    a 
1 4 
2 5 
3 6