如何确定我是否使用包

时间:2017-08-31 08:53:09

标签: r

我的R脚本已经发展了好几个月,有许多增加和减少。这很漫长,我想知道我在代码中实际使用了哪些包,所以我可以开始删除library()引用。有没有办法在我的R脚本中找到冗余依赖项?

我看到this question所以我试过了:

library(mvbutils)
library(MyPackage)
library(dplyr)
foodweb( funs=find.funs( asNamespace( 'EndoMineR')), where= 
             asNamespace( 'EndoMineR'), prune='filter') 

但是这真的告诉我在哪里使用包中的函数,而我不一定记得我在哪个包中使用了哪些函数。

我尝试了packrat,但这是在寻找项目,而我是一个脚本目录,我正在尝试构建一个包。

1 个答案:

答案 0 :(得分:0)

要执行此操作,首先parse您的文件,然后使用getAnywhere检查每个终端令牌在其中定义的命名空间。将结果与搜索路径进行比较,您将得到答案。我编译了一个函数,它接受一个文件名作为参数,并返回文件中使用的包。 请注意,它只能找到执行该功能时加载的软件包,因此请务必加载所有"候选人"第一

findUsedPackages <- function(sourcefile) {

  ## get parse tree
  parse_data <- getParseData(parse(sourcefile))

  ## extract terminal tokens
  terminal_tokens <- parse_data[parse_data$terminal == TRUE, "text"]

  ## get loaded packages/namespaces
  search_path <- search()

  ## helper function to find the package a token belongs to
  findPackage <- function(token) {

    ## get info where the token is defined
    token_info <- getAnywhere(token)

    ##return the package the comes first in the search path
    token_info$where[which.min(match(token_info$where, search_path))]
  }

  packages <- lapply(unique(terminal_tokens), findPackage)

  ##remove elements that do not belong to a loaded namespace
  packages <- packages[sapply(packages, length) > 0]

  packages <- do.call(c, packages)
  packages <- unique(packages)

  ##do not return base and .GlobalEnv
  packages[-which(packages %in% c("package:base", ".GlobalEnv"))]
}