Đây là một chức năng tôi đã viết. Nó kết thúc base::source
chức năng lưu trữ danh sách các tệp có nguồn gốc trong danh sách môi trường chung có tên sourced
. Nó sẽ chỉ nguồn lại một tệp nếu bạn cung cấp một .force=TRUE
đối số cho lệnh gọi đến nguồn. Chữ ký đối số của nó giống với chữ ký thực, source()
vì vậy 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 nó.
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, ...)
}
}
Nó khá là trò chuyện (rất nhiều cuộc gọi đến message()
) vì vậy bạn có thể rút ra những dòng đó nếu bạn quan tâm. Mọi lời khuyên từ những người dùng R kỳ cựu đều được đánh giá cao; Tôi khá mới với R.