2015-12-11 17 views
5

Czy istnieje szybki sposób na zeskanowanie skryptu R i określenie, które pakiety są rzeczywiście używane? Mam tu na myśli przeglądanie wszystkich funkcji wywoływanych w skrypcie i zwracanie listy pakietów zawierających te nazwy funkcji? (Wiem, że nazwy funkcji nie są wyłączne dla jednego pakietu).określają, które pakiety są używane.

Dlaczego nie wystarczy spojrzeć na pakiety wywoływane przez library() lub require()? Dobrze. Cóż, mam zły zwyczaj ładowania pakietów, których często używam, niezależnie od tego, czy faktycznie używam ich w skrypcie.

Chciałbym wyczyścić niektóre skrypty, które zamierzam udostępnić innym, usuwając nieużywane pakiety.

Postanawiam zmienić swoje sposoby w 2016 roku. Pomóż mi zacząć.

Aktualizacja

kilka dobrych pomysłów w komentarzach ...

# create an R file that uses a few functions 

fileConn<-file("test.R") 
writeLines(c("df <- data.frame(v1=c(1, 1, 1), v2=c(1, 2, 3))", 
      "\n", 
      "m <- mean(df$v2)", 
      "\n", 
      "describe(df) #psych package"), 
      fileConn) 
close(fileConn) 

# getParseData approach 
pkg <- getParseData(parse("test.R")) 
pkg <- pkg[pkg$token=="SYMBOL_FUNCTION_CALL",] 
pkg <- pkg[!duplicated(pkg$text),] 
pkgname <- pkg$text 
pkgname 
# [1] "data.frame" "c"   "mean"  "describe" 

Aktualizacja 2

Jest brzydki próba wdrożenia @ Nicola za pomysł:

# load all probable packages first 
pkgList <- list(pkgname) 
for (i in 1:length(pkgname)) { 
    try(print(packageName(environment(get(pkgList[[1]][i]))))) 
} 

Nie podoba się funkcja c(), ale wyniki wydają się być poprawne.

#[1] "base" 
#Error in packageName(environment(get(pkgList[[1]][i]))) : 
# 'env' must be an environment 
#[1] "base" 
#[1] "psych" 
+0

Mam nadzieję, że to nie jest pedantyczny, ale: czy możesz ręcznie odznaczyć wszystkie pakiety w menu Pakiety w RStudio ... a następnie uruchomić skrypt i zobaczyć, jakie funkcje nie może znaleźć? Jeśli rozpoznasz "Oh,' '' melt''' needs '' 'reshape2'''', możesz wejść i wczytać go u góry skryptu. – Nancy

+0

Może 'getParseData', jak opisano [tutaj] (http://stackoverflow.com/q/33064376/324364)? – joran

+0

Chciałbym spróbować ustalić funkcje wywoływane w skrypcie, a następnie uruchomić nad nim 'packageName (environment (function)), które powinno dać pakiet funkcji. Następnie możesz sprawdzić załadowane pakiety i skonfrontować je z faktycznie używanymi. – nicola

Odpowiedz

1

Odpowiedź na podstawie pomysłów w pytaniu komentarze. Kluczowymi funkcjami są getParseData() i packageName().

# create an R file that uses a few functions 

fileConn<-file("test.R") 
writeLines(c("df <- data.frame(v1=c(1, 1, 1), v2=c(1, 2, 3))", 
      "\n", 
      "m <- mean(df$v2)", 
      "\n", 
      "describe(df) #psych package"), 
      fileConn) 
close(fileConn) 

# getParseData approach 
pkg <- getParseData(parse("test.R")) 
pkg <- pkg[pkg$token=="SYMBOL_FUNCTION_CALL",] 
pkg <- pkg[!duplicated(pkg$text),] 
pkgname <- pkg$text 
pkgname 
# [1] "data.frame" "c"   "mean"  "describe" 

# load all probable packages first 
pkgList <- list(pkgname) 
for (i in 1:length(pkgname)) { 
    try(print(packageName(environment(get(pkgList[[1]][i]))))) 
} 

#[1] "base" 
#Error in packageName(environment(get(pkgList[[1]][i]))) : 
# 'env' must be an environment 
#[1] "base" 
#[1] "psych" 

Zaznaczę to jako poprawne na razie, ale chętnie rozważę inne rozwiązania.

Powiązane problemy