如何找到包在 R 中的加载方式?
How to find how a package was loaded in R?
我刚刚更新了所有软件包并重新启动了系统。
然后我加载了 RStudio,然后像往常一样 运行 我的脚本。
我收到一个错误:Error in wday(temp_date) : could not find function "wday"
搜索,我发现 wday
功能是润滑包的一部分,我安装了 lubricate
包,但没有加载。
所以似乎我更新的包中至少有一个以前依赖于润滑包,但现在不再依赖了,结果即使我的脚本加载了所有与以前相同的包,润滑包也被遗漏了。
因此,为了防止这种情况发生,我想知道如何从我的脚本中找出是什么加载了润滑包,如果可能的话,知道发生了什么变化。
我还想知道我所有的包依赖关系,所以我总是知道这个包会加载那个包和其他包,所以我不会再像这样感到惊讶了。
更新:
我发现了更多的错误,慢慢地发现很多包和依赖项实际上并没有更新,必须手动安装。
我发现我正在使用的 wday
来自 data.table 的 IDateTime。但是我又一次没有直接加载这些包,所以我怎么才能找出实际加载它们的内容。
谢谢。
更新二:
这是我的图书馆调用的完整列表:
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);
None 其中包括润滑或 data.table,所以仍然不知道。我想我可以一个接一个地加载每个库,直到函数正常工作,但我真的没有时间或耐心。再次感谢。
我不是 R-internals 或 R-Core 人,所以其中一些是我的猜测和理解。
如果一个包从另一个包导入函数,无论是 one-by-one 还是整个 other-package,那么这些函数不应插入到 您的 搜索路径中.例如,dplyr
是一个相当复杂的包,它从其他几个包和可选的 re-exports 中导入一些包。例如,从它的 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)
,将包导入 your 搜索路径。
更有可能的是,您刚刚列出的其中一个包(我猜是 second-generation dependency-import)导入的包本身不正确地引用了 wday
,当一些更高的包被正确加载时它才开始工作,将该功能带入其有效的搜索路径。
我建议两种方法来找出问题所在:
当你看到错误时,运行 traceback()
并查看函数调用的堆栈;这需要一些侦查,但要找到调用 wday
的位置,在包中找到该函数(包括导出函数和内部函数!),然后从那里开始。
如果所有包都在宣布它们导入的包时是彻底的(通过 Depends:
、Imports:
,甚至是 mis-used 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)"
我刚刚更新了所有软件包并重新启动了系统。 然后我加载了 RStudio,然后像往常一样 运行 我的脚本。
我收到一个错误:Error in wday(temp_date) : could not find function "wday"
搜索,我发现 wday
功能是润滑包的一部分,我安装了 lubricate
包,但没有加载。
所以似乎我更新的包中至少有一个以前依赖于润滑包,但现在不再依赖了,结果即使我的脚本加载了所有与以前相同的包,润滑包也被遗漏了。
因此,为了防止这种情况发生,我想知道如何从我的脚本中找出是什么加载了润滑包,如果可能的话,知道发生了什么变化。 我还想知道我所有的包依赖关系,所以我总是知道这个包会加载那个包和其他包,所以我不会再像这样感到惊讶了。
更新:
我发现了更多的错误,慢慢地发现很多包和依赖项实际上并没有更新,必须手动安装。
我发现我正在使用的 wday
来自 data.table 的 IDateTime。但是我又一次没有直接加载这些包,所以我怎么才能找出实际加载它们的内容。
谢谢。
更新二: 这是我的图书馆调用的完整列表:
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);
None 其中包括润滑或 data.table,所以仍然不知道。我想我可以一个接一个地加载每个库,直到函数正常工作,但我真的没有时间或耐心。再次感谢。
我不是 R-internals 或 R-Core 人,所以其中一些是我的猜测和理解。
如果一个包从另一个包导入函数,无论是 one-by-one 还是整个 other-package,那么这些函数不应插入到 您的 搜索路径中.例如,dplyr
是一个相当复杂的包,它从其他几个包和可选的 re-exports 中导入一些包。例如,从它的 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)
,将包导入 your 搜索路径。
更有可能的是,您刚刚列出的其中一个包(我猜是 second-generation dependency-import)导入的包本身不正确地引用了 wday
,当一些更高的包被正确加载时它才开始工作,将该功能带入其有效的搜索路径。
我建议两种方法来找出问题所在:
当你看到错误时,运行
traceback()
并查看函数调用的堆栈;这需要一些侦查,但要找到调用wday
的位置,在包中找到该函数(包括导出函数和内部函数!),然后从那里开始。如果所有包都在宣布它们导入的包时是彻底的(通过
Depends:
、Imports:
,甚至是 mis-usedSuggests:
) , 然后你可以找到嵌套依赖项的位置,就像这样。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)"