如何告知您在R中使用了哪些软件包
我有一个非常长的R脚本,其中包含许多if语句和异常情况。正如我一直在做的那样,if一直在导入和测试库,但并没有很好地记录它们。问题是,如果我从干净的安装中运行此脚本,我不确定脚本将运行哪些语句,以及需要哪些库 我的问题是:是否有R函数来测试脚本中使用了哪些库如何告知您在R中使用了哪些软件包,r,dependencies,packages,R,Dependencies,Packages,我有一个非常长的R脚本,其中包含许多if语句和异常情况。正如我一直在做的那样,if一直在导入和测试库,但并没有很好地记录它们。问题是,如果我从干净的安装中运行此脚本,我不确定脚本将运行哪些语句,以及需要哪些库 我的问题是:是否有R函数来测试脚本中使用了哪些库 编辑:我还没有使用所有已安装的库,所以打印(sessionInfo())不会有用,但我只想用一个install.packagesfunction启动脚本。我不确定是否有一个好方法可以自动执行此操作。。。但你能做的是: 打开一个新的R控制台
编辑:我还没有使用所有已安装的库,所以打印(sessionInfo())不会有用,但我只想用一个
install.packages
function启动脚本。我不确定是否有一个好方法可以自动执行此操作。。。但你能做的是:
sessionInfo
检查您没有加载额外的包。您可以使用
sessionInfo
检查这一点。如果默认情况下加载额外的包(例如使用.RProfile文件),我建议您避免这样做,因为这会导致灾难。通常,您应该只加载基本包:
stats
、graphics
、grDevices
、utils
、数据集
、方法
和base
您可以使用以下方法卸载任何额外的库:
detach("package:<packageName>", unload=TRUE)
您可能希望在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")