Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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 - Fatal编程技术网

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我只是想用自定义函数跟踪使用情况,并相应地更新了我的原始答案。迟做总比不做好,对吗?