İşte yazdığım bir fonksiyon. base::source
Kaynaklı dosyaların bir listesini adlı global ortam listesinde depolamak için işlevi sarar sourced
. Yalnızca kaynak .force=TRUE
çağrısına bir argüman sağlarsanız bir dosyayı yeniden kaynaklayacaktır. Bağımsız değişken imzası aksi takdirde gerçekle aynıdır, bu source()
nedenle bunu kullanmak için komut dosyalarınızı yeniden yazmanıza gerek yoktur.
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, ...)
}
}
Oldukça konuşkan (çok sayıda arama message()
), bu yüzden eğer umursuyorsanız bu hatları çıkarabilirsiniz. Deneyimli R kullanıcılarından gelen herhangi bir tavsiye takdir edilmektedir; R.'de oldukça yeniyim.