使用R,如何基于library::method跟踪函数?

使用R,如何基于library::method跟踪函数?,r,function,methods,stack-trace,R,Function,Methods,Stack Trace,我正在查看我认为属于库devtools的函数install\u github 有点像。它属于一个库remotes 当RStudio中触发错误时,您可以跟踪堆栈以进行故障排除。我可以主动应用这种逻辑吗 是否有一个函数traceFunction()或可以看到返回顺序library::method调用列表的东西 如果这个函数不存在,可以吗 traceFunction("install_github"); 更新 为了澄清这一点,我对引用的包进行了git克隆开发工具具有以下功能: #

我正在查看我认为属于库
devtools
的函数
install\u github

有点像。它属于一个库
remotes

当RStudio中触发错误时,您可以跟踪堆栈以进行故障排除。我可以主动应用这种逻辑吗

是否有一个函数
traceFunction()
或可以看到返回顺序
library::method
调用列表的东西

如果这个函数不存在,可以吗

traceFunction("install_github");
更新 为了澄清这一点,我对引用的包进行了
git克隆
<代码>开发工具具有以下功能:

#' @importFrom remotes install_github
#' @rdname remote-reexports
#' @export
install_github <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_github))
#' # 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\u remotes
,我通过搜索存储库
remotes

中的所有“.R”文件不容易找到这些文件。简短回答是否定的。R是动态键入的,有许多不同的键入系统(S3、S4、R6等)。简而言之,我们在调用中看到了动态键入的效果,例如,
print
plot
。您可能已经注意到,
print
对于矩阵、简单向量、列表、data.frames等的行为有所不同。
plot
甚至更加多样化,可以处理前面提到的类型,以及几乎任何从其他包(相关矩阵、热图等)抛出的自定义对象-并产生截然不同的结果

这是由于R的方法分派(以及对不同类型系统的类似想法),它基本上关注作为第一个参数传递给函数的对象的类。然后,它尝试为对象的class属性中的每个类调用
plot.
,直到有东西起作用。如果什么都不起作用,它将返回到
绘图。默认值

这就是为什么许多软件包可以使用
plot
-功能的原因。它们实现了一个plot函数,比如
plot.foobaz
,该函数适用于它们的
foobaz
类对象

还有一些方法基于输入,连接函数名,然后尝试调用它们

除此之外,我们还可以向环境中抛出不同的包(例如,
),当包的方法屏蔽以前加载的包时,这些包可能会改变执行路径


因此,为了主动地找出方法的调用树,它将被限制为基于传递的实际对象。有一个包可以做到这一点。

如果它不完全理解您要查找的内容,您可以尝试在该函数上调试(),或者设置断点(
debug()
,如前所述),还是希望在出错时中断(
选项)(error=recover)
)?-对于这些方法,函数从何而来都无关紧要。它们对包函数和脚本中包外定义的函数的工作方式相同,也不管它们来自哪个包。我想要一个
traceforward()
发生错误之前。您能告诉我函数
devtools::install\u github
调用以成功执行的所有方法,以及形式为:
library::method
的有序项列表吗?我认为这与OP的问题无关。此外,您所描述的内容似乎与动态键入无关。这只是多态性,静态类型语言也具有多态性。我的回答是,调用方法链不能仅从源代码确定,除非你想将其扩展到给定任何输入的每一条可能路径。哦,看来你对这个问题的解释与我根本不同(见我在问题下方的评论)。但我可以看出你的解释可能是正确的(在这种情况下,你的答案确实是正确的),所以请大家投票。我的系统中的库路径中确实有
源代码。我想我可以在fn
devtools::install_github
上编写一个解析器,识别它调用的函数,然后有一个fn及其所在位置的字典。大多数“库”对外部使用
library::method
符号,但我必须有一个所有库函数的列表,而不仅仅是那些导出的函数。横穿库的
R
文件夹并不难。我只是希望有一个内部函数来进行跟踪。如果不能完全跟踪库,评估库的质量是一个挑战的根。并评估独立性的必要性。很难评估是否可以将函数跟踪到它进行的所有
library::method
调用。我认为我需要
devtools::source\u url
,直到我看到实际情况。它包括4-5个不同的库来调用
base::source
,所以我写了一些基本的缓存/下载功能,只需大约300行代码,无需外部库即可完成。