2012-03-22 11 views
11

Mam pakiet, który napisałem podczas nauki R i jego lista zależności jest dość długa. Próbuję przyciąć go, dla dwóch przypadków:Wyszukaj wszystkie istniejące funkcje zależności pakietów?

  1. przeszedłem do innych podejść, a pakiety wymienione w Suggests po prostu nie są w ogóle stosowane.
  2. tylko jedną funkcję z całego mojego pakietu zależy od danego uzależnienia, i chciałbym, aby przełączyć się do podejścia, gdzie jest loaded only when needed.

Czy istnieje sposób zautomatyzowany wyśledzić te dwa przypadki? Mogę wymyślić dwa proste podejścia (pobierz listę funkcji we wszystkich pakietach zależnych i zautomatyzuj wyszukiwanie tekstowe za pomocą kodu mojego pakietu, lub załaduj funkcje pakietu bez ładowania wymaganych pakietów i wykonaj, dopóki nie pojawi się błąd), ale ani wydaje się szczególnie elegancki lub niezawodny ...

+1

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. –

+0

Podejrzewam, że skończę coś takiego, ale mam nadzieję na bardziej eleganckie rozwiązanie :-) –

+2

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

Odpowiedz

1

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.

Powiązane problemy