여기 내가 작성한 함수가 있습니다. 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 사용자의 조언을 주시면 감사하겠습니다. 저는 R을 처음 접했습니다.