Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何告知您在R中使用了哪些软件包_R_Dependencies_Packages - Fatal编程技术网

如何告知您在R中使用了哪些软件包

如何告知您在R中使用了哪些软件包,r,dependencies,packages,R,Dependencies,Packages,我有一个非常长的R脚本,其中包含许多if语句和异常情况。正如我一直在做的那样,if一直在导入和测试库,但并没有很好地记录它们。问题是,如果我从干净的安装中运行此脚本,我不确定脚本将运行哪些语句,以及需要哪些库 我的问题是:是否有R函数来测试脚本中使用了哪些库 编辑:我还没有使用所有已安装的库,所以打印(sessionInfo())不会有用,但我只想用一个install.packagesfunction启动脚本。我不确定是否有一个好方法可以自动执行此操作。。。但你能做的是: 打开一个新的R控制台

我有一个非常长的R脚本,其中包含许多if语句和异常情况。正如我一直在做的那样,if一直在导入和测试库,但并没有很好地记录它们。问题是,如果我从干净的安装中运行此脚本,我不确定脚本将运行哪些语句,以及需要哪些库

我的问题是:是否有R函数来测试脚本中使用了哪些库


编辑:我还没有使用所有已安装的库,所以打印(sessionInfo())不会有用,但我只想用一个
install.packages
function

启动脚本。我不确定是否有一个好方法可以自动执行此操作。。。但你能做的是:

  • 打开一个新的R控制台
  • 使用
    sessionInfo
    检查您没有加载额外的包。
    您可以使用
    sessionInfo
    检查这一点。如果默认情况下加载额外的包(例如使用.RProfile文件),我建议您避免这样做,因为这会导致灾难。
    通常,您应该只加载基本包:
    stats
    graphics
    grDevices
    utils
    数据集
    方法
    base

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

    detach("package:<packageName>", unload=TRUE)
    
  • 加载所需的包并重新运行步骤3-5,直到满足要求


  • 您可能希望在GitHub上查看Revolution Analytics的checkpoint函数:

    它做到了这一点,并解决了再现性问题。但我看不出它能报告你正在使用的东西的列表

    但是,如果您仔细阅读了代码,您可能会有一些想法。

    我以前使用过:

    #/usr/bin/env bash
    源文件=($(git ls文件'*.R'))
    grep-hE'\b(require | library)\([\.a-zA-Z0-9]*\)“${source_files[@]}”\
    sed'/^[:空格:]*#/d'|\
    sed-E's/*\([\.a-zA-Z0-9]*)\./\1/'\
    sort-uf\
    >取决于
    
    这将使用Git收集项目中版本控制下的所有R文件。由于您无论如何都应该使用版本控制,这通常是一个很好的解决方案(尽管您可能希望调整版本控制系统)。对于项目不受版本控制的少数情况,您应该(1)将其置于版本控制之下。否则,(2)使用
    find-regex'.*\.[rR]'
    而不是
    git ls文件'*.R'

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


    它只找到对
    库的直接调用
    require
    ,但是–如果包装这些调用,脚本将无法工作。

    当我需要将代码转换为包时,我也有类似的需要,因此我需要识别每个包依赖项,并导入或使用完整的限定名

    在阅读《扩展R》一书时,我发现,
    XRtools::makeImports
    可以扫描一个包,找到所有需要导入的包。这还不能解决我们的问题,因为它只适用于现有的包,但它提供了如何做到这一点的主要见解

    我制作了一个函数并将其放入我的包
    miscelper
    。您可以安装该软件包,或者使用RStudio加载项菜单扫描当前文件或选定代码,或者使用命令行功能。每个外部函数(内部的fun_)和调用它的函数(用法)都将列在表中

    现在可以转到每个函数,按F1键查找它所属的包。实际上,我有另一个软件包,它可以扫描所有安装的软件包中的函数名并构建一个数据库,但这可能会导致更多的误报,因为如果只加载一些软件包,则按F1键只搜索加载的软件包

    请参见“我的软件包”页面中的用法详细信息


    我发现NCmisc(
    install.packages(“NCmisc”)
    )中的
    list.functions.in.file()函数非常有帮助:

    list.functions.in.file(文件名,字母=TRUE)


    有关更多信息,请参见此链接:

    根据每个人的回复,特别是对软件包的建议,我编写了一个小函数,用于输出目录中所有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")
    
    库(NCmisc)
    图书馆(stringr)
    图书馆(dplyr)
    
    checkPacks@Ethaan这并不是他真正想问的。我想你是在寻找剧本作者的铲铲/绝育工具。我认为您注定要运行脚本并在运行过程中安装软件包,弄清楚哪个功能来自哪个软件包。祝您在不同的包中使用相同名称的函数好运(这就是该工具方便的地方)。我发现
    库(“sos”);findFn(“foo”)
    便于查找函数。@Ethaan不用担心,它实际上也是一个有用的链接!我不认为OP要求这样做,但我可能误解了这个问题。我想他问的是:他已经加载了几个库,但不确定哪一个是不必要的。如果您使用
    [\.a-ZA-Z0-9]
    而不是
    \w
    [[:alnum:]]
    则可以捕获所有有效的R包名。是的,这正是我目前正在做的。在开始安装我目前下载的所有软件包时,我可能会有一些声明。-即使他们没有用,为什么会被否决?这不是首选选项有什么原因吗?请注意--您需要先加载包,否则NCmisc不知道函数来自哪个包。如果您使用的是RStudio,并且希望使用它来检查已打开的脚本,请运行
    list.functions.in.file(rstudioapi::getSourceEditorContext()$path,alphatic=TRUE)
    Nice工作正常,但它只检查加载的库。解决方案是加载本博客文章中描述的所有已安装的软件包:short:
    lappy(.packages)(
    
    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")