Ось функція, яку я написав. Він завершує base::source
функцію для зберігання списку джерельних файлів у глобальному списку середовища з назвою sourced
. Він відновить файл лише тоді, якщо ви надасте .force=TRUE
аргумент для виклику до джерела. Підпис його аргументу інакше ідентичний справжньому, source()
тому вам не потрібно переписувати свої сценарії, щоб використовувати це.
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, ...)
}
}
Це досить балакано (багато дзвінків message()
), тож ви можете взяти ці лінії, якщо вам все одно. Будь-яка порада від користувачів ветерана R вдячна; Я досить новачок у Р.