Jednym ze sposobów sprawdzania zależności we wszystkich funkcjach jest użycie kompilatora bajtów, ponieważ sprawdzi on funkcje dostępne w globalnym obszarze roboczym i wyda powiadomienie, jeśli nie znajdzie tej funkcji .
Więc jeśli jako przykład użyć funkcji na.locf z pakietu zoo we wszystkich swoich funkcji, a następnie bajt skompilować funkcję dostaniesz wiadomość tak:
Note: no visible global function definition for 'na.locf'
Aby poprawnie rozwiązać go do kompilacji bajtów musiałbyś napisać to jako zoo: na.locf
Tak więc szybki sposób przetestowania wszystkich funkcji R w bibliotece/pakiecie mógłbyś zrobić coś takiego (zakładając, że nie pisałeś wywołań do inne funkcje z przestrzenią nazw):
Zakładając pliki R z funkcji znajdują się w katalogu C: \ SomeLibrary \ lub podfoldery tam i wtedy zdefiniowanie pliku sourceing C: \ SomeLibrary.r lub podobny zawierającą:
if (!(as.numeric(R.Version()$major) >=2 && as.numeric(R.Version()$minor) >= 14.0)) {
stop("SomeLibrary needs version 2.14.0 or greater.")
}
if ("SomeLibrary" %in% search()) {
detach("SomeLibrary")
}
currentlyInWorkspace <- ls()
SomeLibrary <- new.env(parent=globalenv())
require("compiler",quietly=TRUE)
pathToLoad <- "C:/SomeLibraryFiles"
filesToSource <- file.path(pathToLoad,dir(pathToLoad,recursive=TRUE)[grepl(".*[\\.R|\\.r].*",dir(pathToLoad,recursive=TRUE))])
for (filename in filesToSource) {
tryCatch({
suppressWarnings(sys.source(filename, envir=SomeLibrary))
},error=function(ex) {
cat("Failed to source: ",filename,"\n")
print(ex)
})
}
for(SomeLibraryFunction in ls(SomeLibrary)) {
if (class(get(SomeLibraryFunction,envir=SomeLibrary))=="function") {
outText <- capture.output(with(SomeLibrary,assign(SomeLibraryFunction,cmpfun(get(SomeLibraryFunction)))))
if(length(outText)>0){
cat("The function ",SomeLibraryFunction," produced the following compile note(s):\n")
cat(outText,sep="\n")
cat("\n")
}
}
}
attach(SomeLibrary)
rm(list=ls()[!ls() %in% currentlyInWorkspace])
invisible(gc(verbose=FALSE,reset=TRUE))
następnie uruchom R bez fabrycznie pakiety i źródła w C: \ SomeLibrary.r
A następnie powinieneś otrzymać notatki z cmpfun dla każdego wywołania funkcji w pakiecie, który nie jest częścią pakietów podstawowych i nie ma zdefiniowanej w pełni kwalifikowanej przestrzeni nazw.
Chciałbym to wiedzieć! Zawsze możesz pobrać całą listę zależności i uruchomić "R CMD check", aby sprawdzić, na co "niesformatowane zależności" narzeka, ale to też nie jest idealne. –
Podejrzewam, że skończę coś takiego, ale mam nadzieję na bardziej eleganckie rozwiązanie :-) –
Jednym z szybkich sposobów sprawdzania zależności funkcji jest ich kompilacja bajtowa, ponieważ jeśli nie podasz przestrzeni nazw dla poleceń, które pochodzić z pakietów, będzie narzekać, że nie jest dostępny w skali globalnej. – Hansi