如何查找如何在R中加载程序包?

时间:2019-05-22 16:59:48

标签: r dependencies dependency-management

我刚刚更新了所有软件包并重新启动了系统。 然后,我加载了RStudio,然后开始正常运行脚本。

我收到一个错误:Error in wday(temp_date) : could not find function "wday"

搜索时,我发现wday函数是lubricate软件包的一部分,并且我已安装lubricate软件包,但未加载。

因此,似乎我以前至少有一个更新的软件包依赖于lubricate软件包,但现在不再依赖于此,因此即使我的脚本加载了与以前相同的所有软件包,也错过了润滑软件包。

因此,为了防止将来发生这种情况,我想知道如何从脚本中找出加载了润滑软件包的内容,并在可能的情况下知道更改的内容。 我还想知道我所有的包依赖关系,所以我一直都知道该包会加载该包和其他包,所以我再也不会感到惊讶了。

更新: 我发现了更多的错误,并慢慢发现许多软件包和依赖项实际上并未更新,必须手动安装。 我发现我正在使用的wday来自data.table的IDateTime。但是我又一次没有直接加载这些软件包,所以我怎么才能知道实际加载了什么。 谢谢。

更新2: 这是我完整的图书馆电话清单:

library(qmao);library(chron);library(tseries);library(iterators);library(erer);
library(corpcor); library(zoo); library(xts); library(quantmod);
library(TTR); library(graphics); library(ggplot2); library(gsee);
library(tseries); library(quantstrat); library(plyr); library(caTools);
library(zoo); library(chron); library(gtools); library(microbenchmark);
library(benchmark); library(rbenchmark); library(utils); library(Rcpp);
library(RcppXts); library(RcppArmadillo); library(gtools); library(rcppbugs);
library(RcppClassic); library(RcppStreams); library(inline); library(RcppEigen);
library(RcppParallel); library(RcppProgress); library(doParallel); library(parallel);
library(foreach); library(doMC); library(doSNOW); library(fGarch); library(FitAR);
library(fUnitRoots); library(dplyr);

它们都不包含lubricate或data.table,因此仍然不知道。我想我可以在加载每个库之前一一加载,直到函数正常工作,但是我真的没有时间或耐心。再次感谢。

1 个答案:

答案 0 :(得分:1)

我不是R-internal或R-Core的人,所以部分原因是我的猜测和理解。

如果一个包从另一个包(一个接一个或整个另一个包)导入功能,则这些功能不应插入到您的搜索路径中。例如,dplyr是一个相当复杂的软件包,它从其他几个软件包中导入并有选择地重新导出其中的一些。例如,从其NAMESPACE

importFrom(R6,R6Class)

但是如果您library(dplyr)然后输入R6Class,它将报告Error: object 'R6Class' not found。但是,它对dplyr函数 是可见的:

> R6Class
Error: object 'R6Class' not found
> debug(dplyr::mutate)
> mutate(mtcars, cyl = 5)
debugging in: mutate(mtcars, cyl = 5)
debug: {
    UseMethod("mutate")
}
Browse[2]> R6Class
function (classname = NULL, public = list(), private = NULL, 
    active = NULL, inherit = NULL, lock_objects = TRUE, class = TRUE, 
    portable = TRUE, lock_class = FALSE, cloneable = TRUE, parent_env = parent.frame(), 
    lock) 
{
...

这之所以现在有效,是因为dplyr::mutate中的搜索路径是从dplyr的角度出发,而不是从用户的角度出发。

对此表示怀疑(尽管不确定),这些包将调用library(data.table),将包导入到 搜索路径中。

很有可能是您刚刚列出的一个软件包(我想是第二代依赖项导入)导入的一个软件包本身不正确地引用了wday,并且在以下情况下才开始工作适当地加载了一些更高的软件包,将该函数带入了有效的搜索路径。

我建议两种查找问题所在的方法:

  1. 看到错误时,运行traceback()并查看函数调用堆栈;需要花一些时间,但是要找到调用wday的位置,在包中找到该函数(导出函数和内部函数!),然后从那里开始。

  2. 如果所有软件包都在彻底声明它们导入的软件包(通过Depends:Imports:甚至是滥用的Suggests:),那么您可以查找嵌套的依赖项与类似的内容一起存在。

    pkgs <- trimws(unlist(strsplit(gsub("library\\(([^)]*)\\)", "\\1", "library(qmao);library(chron);library(tseries);library(iterators);library(erer);
    library(corpcor); library(zoo); library(xts); library(quantmod);
    library(TTR); library(graphics); library(ggplot2); library(gsee);
    library(tseries); library(quantstrat); library(plyr); library(caTools);
    library(zoo); library(chron); library(gtools); library(microbenchmark);
    library(benchmark); library(rbenchmark); library(utils); library(Rcpp);
    library(RcppXts); library(RcppArmadillo); library(gtools); library(rcppbugs);
    library(RcppClassic); library(RcppStreams); library(inline); library(RcppEigen);
    library(RcppParallel); library(RcppProgress); library(doParallel); library(parallel);
    library(foreach); library(doMC); library(doSNOW); library(fGarch); library(FitAR);
    library(fUnitRoots); library(dplyr);"), ";")))
    # just so I can search locally on mine without all of those packages
    inst_pkgs <- installed.packages()
    pkgs <- intersect(pkgs, inst_pkgs[,1])
    
    # inexact but "good enough" for now
    possibles <- Filter(function(a) any(grepl("data.table|lubridate", a)),
                        sapply(pkgs, function(p) unlist(packageDescription(p)[c("Depends","Imports","Suggests")])))
    names(possibles)
    # [1] "dplyr"
    

    您可以通过查看该软件包的完整详细信息找到更多信息:

    possibles[[1]]["Suggests"]
    #                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Suggests 
    # "bit64 (>= 0.9.7), callr (>= 3.1.1), covr (>= 3.0.1), DBI (>=\n0.7.14), dbplyr (>= 1.2.0), dtplyr (>= 0.0.2), ggplot2 (>=\n2.2.1), hms (>= 0.4.1), knitr (>= 1.19), Lahman (>= 3.0-1),\nlubridate (>= 1.7.4), MASS, mgcv (>= 1.8.23), microbenchmark\n(>= 1.4.4), nycflights13 (>= 0.2.2), rmarkdown (>= 1.8), RMySQL\n(>= 0.10.13), RPostgreSQL (>= 0.6.2), RSQLite (>= 2.0),\ntestthat (>= 2.0.0), withr (>= 2.1.1), broom (>= 0.5.1), purrr\n(>= 0.3.0), readr (>= 1.3.1), crayon (>= 1.3.4)"