R:创建自定义错误消息,为包中的函数提供参数值

标签 r function debugging dplyr metaprogramming

假设有一组函数,从一个不是我写的包中提取,我想分配给一个特殊的错误行为。我目前关心的是 dplyr 中的 _impl 函数族。以 mutate_impl 为例。当我从 mutate 中得到错误时,traceback 几乎总是将我引导到 mutate_impl,但它通常是调用堆栈的一种方式——我已经看到它从 mutate 调用中调用了多达 15 次。因此,此时我想知道的通常是 mutate_impl 的参数如何与我最初提供给 mutate 的参数相关(或者我认为我提供)。

所以,这段代码可能在很多方面都是错误的——当然它不起作用——但我希望它至少有助于表达我的意图。我的想法是我可以将它包装在 mutate_impl 周围,如果它产生错误,它会保存错误消息和参数描述并将它们作为列表返回

str_impl  <- function(f){tryCatch(f, error = function(c) {
    msg <- conditionMessage(c)
    args <- capture.output(str(as.list(match.call(call(f)))))
    list(message =  msg, arguments = args)
}
assign(str_impl(mutate_impl), .GlobalEnv)

尽管如此,这仍然达不到我真正想要的,因为即使没有工作代码的限制,我也无法弄清楚如何制作草稿。我真正想要的是能够识别一个函数或函数列表,我希望它在出错时具有此行为,然后无论何时何地调用该函数时都会在出错时发生。如果不在 dplyr 包环境中重写函数,我什至想不出任何方法来开始这样做,这让我觉得这是一个非常糟糕的主意。

即使对 mutate_impl 的调用发生在某个无法访问的地方,比如在错误发生后不复存在的环境中,对全局环境的最终分配应该将错误对象带回到我能找到它的地方。

最佳答案

可能实现您想要的最好方法是通过 trace 功能。关于 trace 的帮助肯定值得阅读,但这里有一个工作示例:

library(dplyr)

trace("mutate_impl", exit = quote({
  if (class(returnValue())[1]=="NULL") {
    cat("df\n")
    print(head(df))
    cat("\n\ndots\n")
    print(dots)
  } else {
    # no problem, nothing to do
  }
}), where = mutate, print = FALSE)

# ok
xx <- mtcars %>% mutate(gear = gear * 2)
# not ok, extra output
xx <- mtcars %>% mutate(gear = hi * 2)

根据您的特定需求进行调整应该相当简单,例如如果您想记录到文件:

trace("mutate_impl", exit = quote({
  if (class(returnValue())[1]=="NULL") {
    sink("error.log")
    cat("df\n")
    print(head(df))
    cat("\n\ndots\n")
    print(dots)
    sink()
  } else {
    # no problem, nothing to do
  }
}), where = mutate, print = FALSE)

关于R:创建自定义错误消息,为包中的函数提供参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48757383/

相关文章:

regex - 删除字符串中除第一个以外的所有点

r - 为 geom_smooth 线创建动态标签

azure - Azure 函数的出站 IP 地址

java - 在 IntelliJ IDEA 中调试时,如何防止线程挂起时变量受到影响?

java - 无法删除 Eclipse 中的一些断点

r - ggplot2 boxplot中位数未按预期绘制

R dplyr 查询在 PostgreSQL 中不使用表索引?

list - haskell - 将列表列表转换为一个列表

javascript - TypeScript myFunction 不是函数

debugging - Android Studio 观察表达式持久性