gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:31:07 25 4
gpt4 key购买 nike

假设有一组函数,从一个不是我写的包中提取,我想分配给一个特殊的错误行为。我目前关心的是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com