2015-10-13 11 views
5

Tôi đang xây dựng quy trình phân tích cho các tập dữ liệu lớn nhưng trước tiên tôi phải xác thực nó trên các tập dữ liệu quy mô nhỏ hơn. Những gì tôi muốn làm là để tách tôi "lấy mẫu" tập hợp dữ liệu từ các tập dữ liệu thực tế bằng cách đặt chúng trong một môi trường như thế này:Làm thế nào để chuyển sang một môi trường mới và dính vào nó?

sample_data<-new.env() 
attach(sample_data) 
# downloading sample_data sets 
sample_df_1 <- some_download_function(parameters1) 
sample_df_2 <- some_download_function(parameters2) 
... 
# doing some stuff with them 
... 

Tuy nhiên khi tôi làm điều này, sample_df_1sample_df_2 sẽ được lưu trữ trong môi trường toàn cầu thay vì môi trường sample_data của tôi. Tất nhiên tôi có thể sử dụng assign(..., envir=sample_data) nhưng đó là hơi tẻ nhạt, và tôi không muốn chúng hiển thị trong mã cuối cùng. Nó cũng không phải là lý tưởng để sử dụng with vì các dòng mã bên trong nó không thể được thực hiện từng cái một, mà làm cho nó khá bất tiện ở giai đoạn phát triển.

gì tôi hy vọng sẽ đạt được là cùng một loại hành vi như debugundebug, ví dụ:

switch_to_env(sample_data) 
# Everything done here will be done within environment "sample_data" 
# And the lines of codes here can be executed one by one 
switch_to_env(.GlobalEnv) 

như @Gregor chỉ ra, "thiết lập một tùy chọn" có lẽ tốt hơn mô tả những gì tôi đang tìm kiếm : một tùy chọn cho phép người dùng chỉ định môi trường trong đó R REPL đánh giá các biểu thức.

Cảm ơn!

+1

không chắc chắn tôi hiểu về 'with', bạn có thể thực hiện bất kỳ biểu thức nào trong đó,' với (sample_data, {a <- 1; b <- 2}) ' – jenesaisquoi

+1

Đúng vậy, nhưng nếu tôi có 20 khối mã Tôi muốn phát triển, sau đó để debug chúng tôi phải viết 20 'với()' và đặt mỗi đoạn mã bên trong nó bởi vì mã bên trong 'with' chỉ có thể được đánh giá như một tổng thể. Và khi nó đã sẵn sàng, tôi sẽ phải sao chép chúng ra khỏi hàm 'with'.Theo tôi, nó sẽ nhanh hơn và dễ đọc hơn khi sử dụng cách tiếp cận được gợi ý của tôi. – Benny

+0

Vấn đề là môi trường trong R không hoạt động như thế. Bạn không thể gán các môi trường "mặc định" khác nhau cho bài tập. R là một ngôn ngữ chức năng và thông thường bạn sử dụng các hàm để quản lý phạm vi/môi trường. Vì vậy, bạn nên viết một hàm nhận một môi trường và có thể lồng một 'with()' trong đó. – MrFlick

Trả lời

1

Bạn có thể gán các biến đối với môi trường mới như vậy:

sample_data<-new.env() 
sample_data$sample_df_1 <- some_download_function(parameters1) 
sample_data$sample_df_2 <- some_download_function(parameters2) 

Sau đó, bạn có thể truy cập các biến trong môi trường mới bằng cách hoặc là gắn các môi trường như bạn có hoặc sử dụng sample_data$sample_df_1

Là ý bạn là gì?

+0

Tôi nghĩ OP hy vọng sẽ đạt được một chuyển đổi (hoặc thiết lập một tùy chọn) và có thể nhận được hành vi này mà không cần gõ 'sample_data $' trước mỗi đối tượng. – Gregor

+0

Bạn nhận được tôi @Gregor. – Benny

2

Đây không phải là những gì bạn đang tìm kiếm, nhưng tôi nghĩ nó hoàn toàn khả thi (và an toàn).

Bất cứ khi nào bạn muốn phát triển trong môi trường mới, hãy mở tệp mới và phiên R mới, (sample_data.R), source() một tập lệnh tạo bất kỳ đối tượng nào bạn muốn trong môi trường gốc và phát triển bình thường.

Khi bạn muốn truy cập vào các trong một môi trường cụ thể từ các thực môi trường toàn cầu của bạn, bạn có thể làm điều này (trong gốc phiên R/môi trường của bạn)

sample_data<-new.env() 
source("sample_data.R", local = sample_data) 

Nó có một số nhược điểm: rất bất tiện cho thường xuyên chuyển đổi qua lại, đặc biệt nếu mã của bạn mất nhiều thời gian để chạy. Tuy nhiên, tôi thực sự thích rằng nó làm cho bạn tách mã cho các đối số khác nhau thành các tệp khác nhau - điều này nghe giống như hệ thống có khả năng bị lỗi nếu bạn trộn lẫn ở đâu và trong môi trường nào bạn đang làm việc. Có các tệp riêng biệt cung cấp một số bảo vệ bằng cách thực thi tách mã. Nó cũng làm cho các môi trường phụ khác nhau của bạn dễ dàng bỏ qua khi chạy --- bình luận ra dòng source() trong tệp chính của bạn sẽ tắt toàn bộ môi trường con.

+0

Cảm ơn @Gregor. Mặc dù không phải là những gì tôi ban đầu dự định, câu trả lời của bạn cho thấy một số hiểu biết mà tôi có thể làm việc để tinh chỉnh quy trình làm việc của mình. – Benny

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