2016-02-08 14 views
5

Tôi chi tiêu đã giờ cố gắng để làm công việc này và cảm thấy rằng tôi đang thiếu một cái gì đó đơn giản:Làm thế nào để tiết kiệm một môi trường R độc lập đối tượng

my_env = new.env(hash = TRUE, parent = .GlobalEnv) 
my_env[['echo']] <- function(x) {x} 
my_env[['echo']](123) 
[1] 123 
my_env$echo(123) 
[1] 123 
save(my_env, file = "MyEnv.RData", envir = .GlobalEnv) 
loaded_env <- load(file = "MyEnv.RData",envir = .GlobalEnv) 
typeof(loaded_env) 
[1] "character" 

Khi tôi lưu toàn bộ không gian làm việc, chức năng được lưu lại và sau đó nạp lại (sau khi tôi đóng/mở R Studio). Nhưng ở đây, save() và/hoặc load() không hoạt động và tôi chỉ có một chuỗi trong môi trường của tôi sau khi tải.

Làm cách nào để lưu một đối tượng môi trường riêng biệt vào một tệp, không phải là không gian làm việc hoàn chỉnh? Sau đó tôi cần tất cả các đối tượng bên trong môi trường đó (my_env) để được tải vào .GlobalEnv trong một phiên khác.

Trả lời

4

1) lưu/tải Mã của bạn hoạt động trong đó my_env được khôi phục; tuy nhiên, load trả về tên của các đối tượng đã được khôi phục, chứ không phải chính các đối tượng. Bản thân các đối tượng được âm thầm khôi phục dưới dạng hiệu ứng phụ thay vì thông qua giá trị trả về.

save(my_env, file = "MyEnv.RData") 
rm(my_env) 
nms <- load("MyEnv.RData") 
nms 
## [1] "my_env" 
my_env 
## [1] <environment: 0x000000000bfa5c70> 

2) saveRDS/readRDS Bạn có thể sử dụng luân phiên saveRDSreadRDS để lưu và khôi phục đối tượng duy nhất. Trong trường hợp đó, readRDS trả về chính đối tượng thay vì tên của nó không giống như load.

saveRDS(my_env, file = "MyEnv.RData") 
rm(my_env) 
my_env <- readRDS("MyEnv.RData") 
my_env 
## <environment: 0x000000000bfb45f8> 

3) lưu/đính kèm Một khả năng khác là đặt MyEnv.RData trên con đường tìm kiếm chứ không phải trong môi trường toàn cầu:

save(my_env, file = "MyEnv.RData") 
rm(my_env) 
attach("MyEnv.RData") 
my_env 
## <environment: 0x000000000b072188> 

Lưu ý: Nếu bạn muốn tải các nội dung của my_env vào môi trường toàn cầu thay vì tải my_env bản thân bạn sẽ phải sao chép nội dung ra:

for(el in ls(my_env)) assign(el, get(el, my_env)) 
+0

Cảm ơn! RDS hoạt động hoàn hảo! Làm thế nào tôi có thể serialize một đối tượng môi trường vào một vector char? Có một hàm 'serialize' - nó có trả về cùng một định dạng nhị phân như thể tôi sẽ đọc một tệp từ RDS không? –

+0

'save',' saveRDS' và 'serialize' đều có đối số' ascii'. –

+0

vì vậy nếu tất cả các đối số đều giống nhau, cả ba hàm đều trả về định dạng tương thích nhị phân? –

Các vấn đề liên quan