【问题标题】:How to find out if I am using a package如何确定我是否在使用包
【发布时间】:2017-08-31 08:53:09
【问题描述】:

我的 R 脚本已经发展了好几个月,有很多加法和减法。它很长而且很杂乱,我想找出我在代码中实际使用的包,以便我可以开始删除 library() 引用。有没有办法在我的 R 脚本中找到冗余依赖项?

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

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

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

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

【问题讨论】:

  • 除非你有数百个,否则我会注释掉 (#) 你的库调用,运行脚本并查看哪里出错,重新添加所需的库,冲洗并重复。
  • 但我有大约 50 个函数。当然有更好的方法....
  • 将来帮助解决此问题的一种方法是在函数中包含对必需库的调用。这样,每个函数都更加独立,并且如果库已经加载,则没有影响。

标签: r


【解决方案1】:

为此,您首先要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"))]
}

【讨论】:

    猜你喜欢
    • 2012-07-24
    • 2019-08-20
    • 2013-03-05
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多