首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中找到一个包是如何装载的?

如何在R中找到一个包是如何装载的?
EN

Stack Overflow用户
提问于 2019-05-22 16:59:47
回答 1查看 517关注 0票数 2

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

我发现了一个错误:Error in wday(temp_date) : could not find function "wday"

搜索后,我发现wday函数是润滑包的一部分,我已经安装了lubricate包,但没有加载。

因此,看起来至少我以前更新的包中至少有一个依赖于润滑包,但现在不是了,因此即使我的脚本像以前一样加载了所有相同的包,润滑包也被错过了。

因此,为了防止这是未来,我想知道如何从我的脚本找到什么加载润滑包,如果可能的话,知道什么改变了。我还想知道我所有的包依赖关系,所以我总是知道这个包加载了这个包和其他包,所以我不再感到惊讶了。

更新:--我发现了更多的错误,并且缓慢地计算出许多包和依赖项实际上没有被更新,必须手动安装。我发现我正在使用的wday是来自data.table的IDateTime。但是再一次,我不会直接加载这些包,所以我如何才能找到实际加载它们的内容。谢谢。

更新2:这里是我的库调用的完整列表:

代码语言:javascript
复制
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);

他们没有包括润滑或data.table,所以仍然不知道。我想我可以1比1加载每个库,直到函数工作为止,但我真的没有时间或耐心。再次感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-22 19:25:04

我不是一个R-内线或R-核心的家伙,所以这其中的一些是我的推测和理解。

如果一个包从另一个包导入函数,则不应该将这些函数插入到搜索路径中。例如,dplyr是一个相当复杂的包,它从其他几个包中导入并可选择地再导出其中的一些包。例如,从它的NAMESPACE

代码语言:javascript
复制
importFrom(R6,R6Class)

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

代码语言:javascript
复制
> 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);图书馆(Corpcor);图书馆(动物园);图书馆(Xts);图书馆(Quantmod);图书馆(TTR);图书馆(图形);图书馆(Ggplot2);图书馆(Ggplot2);图书馆(Tseries);图书馆(Quantstrat);图书馆(Plyr);图书馆(CaTools);图书馆(动物园);图书馆(Chron);图书馆(Gtools);图书馆(RcppXts);图书馆(RcppClassic);图书馆(RcppStreams);图书馆(内联);图书馆(RcppEigen);图书馆(RcppParallel);图书馆(RcppProgress);图书馆(DoParallel);图书馆(并行);图书馆(DoMC);图书馆(DoSNOW);图书馆(FGarch);图书馆(FitAR);图书馆(FUnitRoots);图书馆(Dplyr);“);)#这样我就可以在本地搜索inst_pkgs <- installed.packages() pkgs <- installed.packages()pkgs <-交(pkgs,inst_pkgs,1) #不精确但“足够好”,但现在可以<-Filter(函数(A) any(grepl("data.table|lubridate",a)),sapply(pkgs,function(p) unlist(packageDescription(P)c(“依赖”,"Imports",“建议”))名称(可能)#1 "dplyr“) 通过查看该软件包的详细信息,您可以找到更多信息: possibles[1] #建议# "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)、>=1.19、Lahman (>= 3.0-1)、\nlubridate (>= 1.7.4)、质量、mgcv (>= 1.8.23)、微基准(>= 1.4.4)、nycflights13 (>= 0.2.2)、rmarkdown (>= 1.8)、RMySQL\n(>= 0.10.13)、RPostgreSQL (>= 0.6.2)、RSQLite (>= 2.0)、\n readr (>= 2.0.0)、withr (>= 2.1.1)、broom (>= 0.5.1)、purrr\n(>= 0.3.0)、readr (>= 1.3.1)、>=1.3.4“
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56261750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档