我刚刚更新了所有软件包并重新启动了系统。 然后,我加载了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,因此仍然不知道。我想我可以在加载每个库之前一一加载,直到函数正常工作,但是我真的没有时间或耐心。再次感谢。
答案 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
,并且在以下情况下才开始工作适当地加载了一些更高的软件包,将该函数带入了有效的搜索路径。
我建议两种查找问题所在的方法:
看到错误时,运行traceback()
并查看函数调用堆栈;需要花一些时间,但是要找到调用wday
的位置,在包中找到该函数(导出函数和内部函数!),然后从那里开始。
如果所有软件包都在彻底声明它们导入的软件包(通过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)"