Đây là một chức năng tôi đã viết. Nó kết thúc tốt đẹp các chức năng base::source
để lưu trữ một danh sách các tập tin có nguồn gốc trong một danh sách môi trường toàn cầu có tên sourced
. Nó sẽ chỉ tái nguồn một tệp nếu bạn cung cấp đối số .force=TRUE
cho lệnh gọi tới nguồn. Ký hiệu đối số của nó là nếu không giống với source()
thực, do đó bạn không cần phải viết lại các tập lệnh của mình để sử dụng.
warning("overriding source with my own function FYI")
source <- function(path, .force=FALSE, ...) {
library(tools)
path <- tryCatch(normalizePath(path), error=function(e) path)
m<-md5sum(path)
go<-TRUE
if (!is.vector(.GlobalEnv$sourced)) {
.GlobalEnv$sourced <- list()
}
if(! is.null(.GlobalEnv$sourced[[path]])) {
if(m == .GlobalEnv$sourced[[path]]) {
message(sprintf("Not re-sourcing %s. Override with:\n source('%s', .force=TRUE)", path, path))
go<-FALSE
}
else {
message(sprintf('re-sourcing %s as it has changed from: %s to: %s', path, .GlobalEnv$sourced[[path]], m))
go<-TRUE
}
}
if(.force) {
go<-TRUE
message(" ...forcing.")
}
if(go) {
message(sprintf("sourcing %s", path))
.GlobalEnv$sourced[path] <- m
base::source(path, ...)
}
}
Khá thú vị (nhiều cuộc gọi đến message()
) để bạn có thể lấy những dòng đó ra nếu bạn quan tâm. Bất kỳ lời khuyên từ người dùng R cựu chiến binh đều được đánh giá cao; Tôi khá mới với R.
Nguồn
2013-05-16 17:16:54
Tôi tạo các gói cho các dự án độc lập mọi lúc. Nó không có nhiều công việc, và lợi ích là rất lớn. Tiếp tục, bạn biết bạn muốn làm điều đó ... – Andrie