นี่คือฟังก์ชันที่ฉันเขียน มันห่อฟังก์ชั่นในการจัดเก็บรายชื่อของไฟล์ที่มาในรายการสภาพแวดล้อมของโลกชื่อ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 รุ่นเก๋า ฉันค่อนข้างใหม่สำหรับอาร์