gpt4 book ai didi

R warning() 包装器 - 引发到父函数

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

我有一个围绕 R 中内置 warning() 函数的包装器,它基本上调用 warning(sprintf(...)):

warningf <- function(...)
warning(sprintf(...))

这是因为我经常使用 warning(sprintf(...)) ,所以我决定用它制作一个函数(它位于我经常使用的函数的包中)。

然后,我在编写函数时使用 warningf 。即,不要写:

f <- function() {
# ... do stuff
warning(sprintf('I have %i bananas!',2))
# ... do stuff
}

我写:

f <- function() {
# ... do stuff
warningf('I have %i bananas!',2)
# ... do stuff
}

如果我调用第一个 f(),我会得到:

Warning message:
In f() : I have 2 bananas!

这很好 - 它告诉我警告来自 f() 以及出了什么问题。

如果我调用第二个f(),我会得到:

Warning message:
In warningf("I have %i bananas!",2) : I have 2 bananas!

这并不理想 - 它告诉我警告位于 warningf 函数中(当然,因为是 warningf 函数调用 warning >,而不是 f),掩盖了它实际上来自 f() 函数的事实。

所以我的问题是:我能否以某种方式“引发”warning 调用,以便它在 f() 消息中显示 警告,而不是 warningf 中的警告

最佳答案

处理此问题的一种方法是获取调用堆栈中的环境列表,然后将父框架的名称粘贴到警告中。

您可以使用函数 sys.call() 来执行此操作,该函数返回调用堆栈中的一个项目。您想要提取此列表中最后一个元素的第二个元素,即 warningf 的父元素:

warningf <- function(...){
parent.call <- sys.call(sys.nframe() - 1L)
warning(paste("In", deparse(parent.call), ":", sprintf(...)), call.=FALSE)
}

现在,如果我运行你的函数:

> f()
Warning message:
In f() : I have 2 bananas!
<小时/>

稍后编辑:deparse(parent.call)f() 函数有参数的情况下将调用转换为字符串,并按原样显示调用已指定(即包括参数等)。

关于R warning() 包装器 - 引发到父函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596918/

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