2012-03-22 3 views
11

У меня есть пакет, который я написал, изучая R, и его список зависимостей довольно длинный. Я стараюсь, чтобы урезать его вниз, в двух случаях:Поиск всех существующих функций для зависимостей пакетов?

  1. я переключился на другие подходы, и пакеты, перечисленные в Suggests просто не используются.
  2. только одна функция из всего моего пакета зависит от данной зависимости, и я хотел бы перейти к подходу, где loaded only when needed.

Есть автоматизированный способ отследить эти два случая? Я могу подумать о двух грубых подходах (загрузите список функций во всех зависимых пакетах и ​​автоматизируйте текстовый поиск для них через код моего пакета или загрузите функции пакета без загрузки необходимых пакетов и выполните до тех пор, пока не появится ошибка), но ни кажется особенно элегантным или надежным ....

+1

Мне также хотелось бы узнать это! Вы всегда можете отбирать весь список зависимостей и запускать «R CMD check», чтобы узнать, о каких «неустановленных зависимостях» он жалуется, но это тоже не идеально. –

+0

Я подозреваю, что сделаю что-то подобное, но, надеясь на более элегантное решение :-) –

+2

Одним быстрым способом проверки зависимостей функций является байт, который компилирует их, потому что если вы не дадите пространствам имен команд, которые из пакетов он будет жаловаться, что он недоступен в глобальном масштабе. – Hansi

ответ

1

Одним из способов проверки зависимостей во всех функциях является использование байтового компилятора, поскольку это проверяет наличие функций в глобальной рабочей области и выдает уведомление, если оно не находит указанную функцию ,

Так что, если вы в качестве примера использования функции na.locf из пакета зоопарка в любой из ваших функций, а затем байт компиляции функции вы получите сообщение, как это:

Note: no visible global function definition for 'na.locf' 

Для правильного ее решения для составления байт вам нужно будет написать его как зоопарк :: na.locf

Так что, чтобы быстро протестировать все функции R в библиотеке/пакете, вы могли бы сделать что-то вроде этого (если вы не писали вызовы другие функции с пространством имен):

Предполагая, что ваши файлы R с функциями в C: \ SomeLibrary \ или подпапок там из, а затем вы определяете sourceing файл как C: \ SomeLibrary.r или аналогичный, содержащий:

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)) 

затем запустить R с не предустановленными пакеты и источник в C: \ SomeLibrary.r

И тогда вы должны получать заметки от cmpfun для любого вызова функции в пакете, который не является частью базовых пакетов и не имеет полностью определенного пространства имен.