R能否区分手动加载的库和依赖项
我已经编写了一个函数来获取所有加载包的名称和版本:R能否区分手动加载的库和依赖项,r,R,我已经编写了一个函数来获取所有加载包的名称和版本: my_lib <- function(){ tmp <- (.packages()) tmp_base <- sessionInfo()$basePkgs tmp <- setdiff(tmp, tmp_base) tmp <- sort(tmp) tmp <- sapply(tmp, function(x){ x <- paste(x, utils::packageVe
my_lib <- function(){
tmp <- (.packages())
tmp_base <- sessionInfo()$basePkgs
tmp <- setdiff(tmp, tmp_base)
tmp <- sort(tmp)
tmp <- sapply(tmp, function(x){
x <- paste(x, utils::packageVersion(x), sep = ' v')
})
tmp <- paste(tmp, collapse=', ')
return(tmp)
}
my_libR在加载的包和附加的包之间有细微的区别。
当您使用库
功能时,会附加一个包,
并且它使其导出的函数对用户的全局环境“可见”。
如果附有包裹,
其名称空间已加载,
但事实并非如此
每个包可以定义两种主要的依赖关系类型:依赖
和导入
。
前者中的包在从属包连接后立即连接,
但后者中的包只能加载
这意味着你不能完全区分,
因为您可以为特定的包调用库
,
但是它所依赖的任何包也将被附加。
不过,您可以使用loadednamespace()
和search()
区分已加载和附加的包
编辑:我刚刚想到,如果您想跟踪库的使用情况
(忽略要求),
您可以编写一个自定义跟踪器:
library_tracker <- with(new.env(), {
packages <- character()
function(flag) {
if (missing(flag)) {
packages <<- union(packages, as.character(substitute(package, parent.frame())))
}
packages
}
})
trace("library", library_tracker, print = FALSE)
library("dplyr")
library(data.table)
# retrieve packages loaded so far
library_tracker(TRUE)
[1] "dplyr" "data.table"
library\u tracker如果查看sessionInfo()
,它会区分其他附加包:
和通过命名空间加载(未附加):
。但是我认为一些包作者会通过附加它们来加载它们的依赖项,因此您可能会看到一些依赖项显示为附加包。谢谢!我现在使用sessionInfo()
从列表中删除了一些基本包。我认为我使用的大多数依赖项都必须附加,因为它们都显示在其他附加包
部分:PIn-general,我认为最好的做法是只加载包而不附加它们的依赖项,但这不是一个硬性规则(请参阅)。因此,以这种方式可能无法清楚区分已加载的包/依赖项。RStudio现在会自动提供一些建议,当它可以看到脚本中使用的包未安装时,它可能只是扫描脚本以进行library()
调用,这可能是另一种方法。这也是我的第一个想法(扫描库)但是,我们通常在不同的文件中进行数据准备,然后source
它,这就是大多数库被调用的地方。我想我可以扫描源
命令,然后扫描相应的文件,但这会困难得多,因为我们也有源函数。@RAB我只是想用自定义函数跟踪使用情况,并相应地更新了我的原始答案。迟做总比不做好,对吗?