Tôi đang viết một số chức năng để thực hiện các tác vụ lặp lại, nhưng tôi đang cố gắng giảm thiểu số lần tôi tải dữ liệu. Về cơ bản tôi có một chức năng mà có một số thông tin và làm cho một cốt truyện. Sau đó, tôi có một chức năng thứ hai sẽ lặp qua và xuất nhiều lô thành một tệp .pdf. Trong cả hai chức năng tôi có dòng mã sau đây:Lựa chọn môi trường chức năng lồng nhau
if(load.dat) load("myworkspace.RData")
nơi load.dat
là một logic và dữ liệu mình cần được lưu trữ trong myworkspace.RData. Khi tôi gọi hàm wrapper lặp lại và xuất ra nhiều ô, tôi không muốn tải lại vùng làm việc trong mọi cuộc gọi đến hàm bên trong. Tôi nghĩ rằng tôi chỉ có thể tải không gian làm việc một lần trong chức năng wrapper, sau đó chức năng bên trong có thể truy cập dữ liệu đó, nhưng tôi có một lỗi nói khác. Vì vậy, sự hiểu biết của tôi là khi một hàm không thể tìm thấy biến trong môi trường cục bộ của nó (được tạo khi hàm được gọi), hàm sẽ xem xét môi trường cha mẹ cho biến đó.
Tôi giả định môi trường mẹ cho cuộc gọi hàm bên trong sẽ là cuộc gọi hàm bên ngoài. Rõ ràng đây là không đúng:
func1 <- function(...){
print(var1)
}
func2 <- function(...){
var1 <- "hello"
func1(...)
}
> func2()
Error in print(var1) : object 'var1' not found
Sau khi đọc rất nhiều câu hỏi, hướng dẫn ngôn ngữ, và this bài đăng blog thực sự hữu ích, tôi đã đưa ra như sau:
var1 <- "hello"
save(list="var1",file="test.RData")
rm(var1)
func3 <- function(...){
attach("test.RData")
func1(...)
detach("file:test.RData")
}
> func3()
[1] "hello"
Có cách nào tốt hơn để làm điều này? Tại sao không func1
tìm các biến không xác định trong môi trường cục bộ được tạo bởi func2
, khi đó là func2
được gọi là func1
?
Lưu ý: Tôi không biết cách đặt tên cho câu hỏi này. Nếu bất cứ ai có đề xuất tốt hơn, tôi sẽ thay đổi nó và chỉnh sửa dòng này.
đóng cửa
Phạm vi từ vựng có nghĩa là chức năng sẽ xem xét cho các ký hiệu không xác định trong môi trường mẹ của nó, mà không nhất thiết phải là môi trường gọi. Kiểm tra điều này cũng: https://github.com/hadley/devtools/wiki/Environments –
@ Ferdinand.kraft Cảm ơn bạn đã liên kết. Tôi sẽ làm việc thông qua chiều nay. – dayne
Nếu dữ liệu của bạn ở dạng dataframes, bạn có thể sử dụng gói 'data.table' và chuyển các bảng của bạn thành đối số cho' func1' bên trong 'func3'. Gói này hoạt động theo tham chiếu và không tạo các bản sao dữ liệu không mong muốn của bạn. –