搜索所有现有函数以获取包依赖性?

时间:2012-03-22 01:47:11

标签: r package

我在学习R时写了一个包,它的依赖列表很长。在两种情况下,我试图将其削减:

  1. 我转而使用其他方法,Suggests中列出的软件包根本就没用过。
  2. 我的整个软件包中只有一个函数依赖于给定的依赖项,我想切换到loaded only when needed.
  3. 的方法

    是否有自动跟踪这两种情况的方法?我可以想到两个粗略的方法(下载所有依赖包中的函数列表,并通过我的包的代码自动搜索它们,或者加载包函数而不加载所需的包并执行直到那里&#39 ;是一个错误),但似乎都不是特别优雅或万无一失......

1 个答案:

答案 0 :(得分:1)

检查所有函数中的依赖项的一种方法是使用字节编译器,因为它将检查全局工作空间中可用的函数,并在未找到所述函数时发出通知。

因此,如果您作为示例在任何函数中使用zoo包中的na.locf函数,然后对您的函数进行字节编译,您将得到如下消息:

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

要正确地解决它以进行字节编译,您必须将其写为zoo :: na.locf

所以快速测试库/包中的所有R函数你可以做这样的事情(假设你没有用命名空间编写对其他函数的调用):

假设带有这些函数的R文件位于C:\ SomeLibrary \或其子文件夹中,然后将源文件定义为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获取对包中的函数的任何调用的注释,该包不是基本包的一部分,并且没有定义完全限定的命名空间。