如何判断你在R中使用了哪些包

aeo*_*ail 19 dependencies packages r

我有一个非常长的R脚本,包含许多if语句和异常情况.正如我一直在进行的那样,如果我已经去过导入和测试库,并且没有真正记录它们.问题是,如果我从一个干净的安装运行它,我不确定脚本将运行哪些语句,因此需要哪些库.

我的问题是:是否有任何R函数来测试脚本中正在使用哪些库?

编辑:我没有使用所有已安装的库,因此print(sessionInfo())没有用, 但我只是想用install.packages函数启动脚本

Kon*_*lph 8

'renv' 包现在通过renv::dependencies.

renv::dependencies执行适当的静态分析并可靠地找到包依赖项,即使它们以非标准方式(例如 via box::use)或通过包DESCRIPTION文件而不是 vialibrary或 声明::


作为一个快速的黑客,我以前(pre-'renv')为此使用了一个shell脚本

#!/usr/bin/env bash

source_files=($(git ls-files '*.R'))
grep -hE '\b(require|library)\([\.a-zA-Z0-9]*\)' "${source_files[@]}" | \
    sed '/^[[:space:]]*#/d' | \
    sed -E 's/.*\(([\.a-zA-Z0-9]*)\).*/\1/' | \
    sort -uf \
    > DEPENDS
Run Code Online (Sandbox Code Playgroud)

这使用 Git 收集项目中版本控制下的所有 R 文件。由于您无论如何都应该使用版本控制,因此这通常是一个很好的解决方案(尽管您可能想要调整版本控制系统)。对于项目不受版本控制的少数情况,您应该 (1) 将其置于版本控制之下。或者,如果失败,(2)使用find . -regex '.*\.[rR]'而不是git ls-files '*.R'.

它会生成一个包含非常简单的依赖项列表的DEPENDS文件

它只找到对libraryand 的直接调用require——如果你包装这些调用,脚本将无法工作。

  • 我不认为 OP 要求这样做,但我可能误解了这个问题。我认为他要问的是:他已经加载了几个库,但不确定哪一个是不必要的。 (7认同)

eh2*_*h21 6

我发现list.functions.in.file()NCmisc(install.packages("NCmisc"))中的函数对此很有帮助:

list.functions.in.file(filename, alphabetic = TRUE)

有关更多信息,请参见以下链接:https : //rdrr.io/cran/NCmisc/man/list.functions.in.file.html

  • 请注意——您需要先加载包,否则 NCmisc 不知道该函数来自哪个包。 (3认同)
  • 为什么会对此表示不满?为什么这不是首选选项? (2认同)
  • 如果您使用 RStudio 并希望使用它来检查已打开的脚本,请运行“list.functions.in.file(rstudioapi::getSourceEditorContext()$path, letteric = TRUE)” (2认同)

小智 6

根据大家的反应,特别是eh21NCmisc包的建议,我整理了一个小函数,输出一个目录中所有 R 脚本中使用的包列表,以及它们的频率。

library(NCmisc)
library(stringr)
library(dplyr)

checkPacks<-function(path){

    ## get all R files in your directory
    ## by the way, extract R code from Rmd: http://felixfan.github.io/extract-r-code/
    files<-list.files(path)[str_detect(list.files(path), ".R$")]

    ## extract all functions and which package they are from 
    ## using NCmisc::list.functions.in.file
    funs<-unlist(lapply(paste0(path, "/", files), list.functions.in.file))
    packs<-funs %>% names()

    ## "character" functions such as reactive objects in Shiny
    characters<-packs[str_detect(packs, "^character")]

    ## user defined functions in the global environment
    globals<-packs[str_detect(packs, "^.GlobalEnv")]

    ## functions that are in multiple packages' namespaces 
    multipackages<-packs[str_detect(packs, ", ")]

    ## get just the unique package names from multipackages
    mpackages<-multipackages %>%
               str_extract_all(., "[a-zA-Z0-9]+") %>%
               unlist() %>%
               unique()
    mpackages<-mpackages[!mpackages %in% c("c", "package")]

    ## functions that are from single packages
    packages<-packs[str_detect(packs, "package:") & !packs %in% multipackages] %>%
              str_replace(., "[0-9]+$", "") %>%
              str_replace(., "package:", "") 

    ## unique packages
    packages_u<-packages %>%
                unique() %>%
                union(., mpackages)

    return(list(packs=packages_u, tb=table(packages)))

}

checkPacks("~/your/path")
Run Code Online (Sandbox Code Playgroud)


nic*_*ico 5

我不确定自动化这个的好方法......但你可以做的是:

  1. 打开一个新的 R 控制台
  2. 检查sessionInfo您是否没有加载额外的包。
    您可以使用sessionInfo. 如果您默认加载额外的包(例如使用您的 .RProfile 文件),我建议您避免这样做,因为它会导致灾难。
    通常情况下,你应该只加载了基础包:statsgraphicsgrDevicesutilsdatasetsmethods,和base

    您可以使用以下方法卸载任何额外的库:

    detach("package:<packageName>", unload=TRUE)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在在注释所有libraryrequire调用后运行脚本,看看哪些函数给出了错误。

  4. 要在控制台中获取每个函数类型需要哪个包:

    ??<functionName>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 加载所需的包并重新运行步骤 3-5,直到满意为止。