2016-01-21 19 views
1

這是非常基本的(我懷疑這已被要求在其他地方,雖然不大here)。R,從.rda對象分配內容與負載()

我有一個巨大的.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

如果您確信您的所有文件只包含一個對象,你可以採取優點在包裝函數的參數envirload這樣的:

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