aeo*_*ail 19 dependencies packages r
我有一个非常长的R脚本,包含许多if语句和异常情况.正如我一直在进行的那样,如果我已经去过导入和测试库,并且没有真正记录它们.问题是,如果我从一个干净的安装运行它,我不确定脚本将运行哪些语句,因此需要哪些库.
我的问题是:是否有任何R函数来测试脚本中正在使用哪些库?
编辑:我没有使用所有已安装的库,因此print(sessionInfo())
没有用, 但我只是想用install.packages
函数启动脚本
'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
文件。
它只找到对library
and 的直接调用require
——如果你包装这些调用,脚本将无法工作。
我发现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
小智 6
根据大家的反应,特别是eh21对NCmisc包的建议,我整理了一个小函数,输出一个目录中所有 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)
我不确定自动化这个的好方法......但你可以做的是:
检查sessionInfo
您是否没有加载额外的包。
您可以使用sessionInfo
. 如果您默认加载额外的包(例如使用您的 .RProfile 文件),我建议您避免这样做,因为它会导致灾难。
通常情况下,你应该只加载了基础包:stats
,graphics
,grDevices
,utils
,datasets
,methods
,和base
。
您可以使用以下方法卸载任何额外的库:
detach("package:<packageName>", unload=TRUE)
Run Code Online (Sandbox Code Playgroud)现在在注释所有library
和require
调用后运行脚本,看看哪些函数给出了错误。
要在控制台中获取每个函数类型需要哪个包:
??<functionName>
Run Code Online (Sandbox Code Playgroud)加载所需的包并重新运行步骤 3-5,直到满意为止。
归档时间: |
|
查看次数: |
7538 次 |
最近记录: |