Как узнать, как пакет был загружен в R? - PullRequest
2 голосов
/ 22 мая 2019

Я только что обновил все свои пакеты и перезапустил мою систему.Затем я загрузил RStudio и запустил свои сценарии как обычно.

Я получил ошибку: Error in wday(temp_date) : could not find function "wday"

При поиске я обнаружил, что функция wday является частью пакета смазки, иУ меня установлен пакет lubricate, но он не загружен.

Так что, по крайней мере, один из моих обновленных пакетов ранее зависел от пакета смазки, но больше не является результатом, даже если мои сценариизагрузил все те же пакеты, что и раньше, пакет смазочных материалов был пропущен.

Поэтому, чтобы предотвратить это будущее, я хотел бы узнать, как узнать, что загрузило пакет смазочных материалов из моего сценария, и, если возможно, узнать, чтоизменилось.Я также хотел бы знать все мои зависимости пакета, чтобы я всегда знал, что этот пакет загружает этот и другой пакет, поэтому я больше не удивлен таким образом.

Обновление: Я обнаружил больше ошибоки постепенно выяснилось, что многие пакеты и зависимости на самом деле не обновлялись и должны были устанавливаться вручную.Я обнаружил, что wday, который я использую, взят из IDateTime из data.table.Но еще раз я не загружаю эти пакеты напрямую, так как я могу узнать, что на самом деле их загрузило.Спасибо.

Обновление 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);

Ни один из них не включает смазки или data.table, так что до сих пор не знаю,Я полагаю, что я мог бы идти 1: 1, загружая каждую библиотеку, пока не сработают функции, но у меня действительно нет ни времени, ни терпения для этого.Еще раз спасибо.

1 Ответ

1 голос
/ 22 мая 2019

Я не R-internals или 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)" 
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...