如何基于library::method跟踪函数?

lndjwyie  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(122)

我正在查看函数install_github,我认为它属于库devtools
算是吧,它属于remotes库。
当在RStudio中触发错误时,您可以通过跟踪堆栈来进行故障排除,我可以主动应用这种逻辑吗?
是否有函数traceFunction()或其他东西可以看到返回顺序library::method调用的列表?
如果这个函数不存在,它会存在吗?

traceFunction("install_github");

为了澄清,我对引用的包执行了git clonedevtools包含以下内容:

#' @importFrom remotes install_github
#' @rdname remote-reexports
#' @export
install_github <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_github))

其中remotes具有以下内容:

#' # To install from a private repo, use auth_token with a token
#' # from https://github.com/settings/tokens. You only need the
#' # repo scope. Best practice is to save your PAT in env var called
#' # GITHUB_PAT.
#' install_github("hadley/private", auth_token = "abc")
#'
#' # To pass option arguments to `R CDM INSTALL` use `INSTALL_opts`. e.g. to
#' install a package with source references and tests
#' install_github("rstudio/shiny", INSTALL_opts = c("--with-keep.source", "--install-tests"))
#' }
install_github <- function(repo,
                           ref = "HEAD",
                           subdir = NULL,
                           auth_token = github_pat(quiet),
                           host = "api.github.com",
                           dependencies = NA,
                           upgrade = c("default", "ask", "always", "never"),
                           force = FALSE,
                           quiet = FALSE,
                           build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"),
                           build_manual = FALSE, build_vignettes = FALSE,
                           repos = getOption("repos"),
                           type = getOption("pkgType"),
                           ...) {

  remotes <- lapply(repo, github_remote, ref = ref,
    subdir = subdir, auth_token = auth_token, host = host)

  install_remotes(remotes, auth_token = auth_token, host = host,
    dependencies = dependencies,
    upgrade = upgrade,
    force = force,
    quiet = quiet,
    build = build,
    build_opts = build_opts,
    build_manual = build_manual,
    build_vignettes = build_vignettes,
    repos = repos,
    type = type,
    ...)
}

它调用install_remotes,通过搜索存储库remotes中的所有“.R”文件,我不容易找到它。

a64a0gku

a64a0gku1#

简单地说,没有。R是动态类型化的,并且有许多不同的类型化系统(S3,S4,R6等)。简而言之,我们看到了动态类型在调用printplot时的效果。您可能已经注意到,print对矩阵、简单向量、列表data.frames等。plot甚至更加多样化,并且可以处理前面提到的类型,以及从其他包(相关矩阵、热图等)抛给它的几乎任何定制对象-并且产生非常不同的结果。
这是由于R的方法调度(以及不同类型系统的类似想法),它主要查看作为第一个参数传递给函数的对象的类,然后尝试为对象的class-attribute中的每个类调用plot.<class>,直到有什么东西起作用为止,如果没有任何东西起作用,它福尔斯到plot.default
这就是为什么很多包都可以使用plot-函数,它们实现了plot-函数,比如说plot.foobaz,它为foobaz类的对象工作。
还有一些方法,它们基于输入,连接函数名 *,然后尝试调用它们 *。
除此之外,我们可以将不同的包扔到环境中(例如library),这可能会改变执行路径,当一个包的方法 * 屏蔽 * 一个先前加载的包时。
因此,为了主动地计算方法的调用树,它将被限制为基于 * 传递的实际对象 *。有一个包可以做到这一点,https://rdrr.io/cran/lobstr/man/cst.html

相关问题