gpt4 book ai didi

r - 从 R 代码调用中断

转载 作者:行者123 更新时间:2023-12-04 15:32:56 25 4
gpt4 key购买 nike

我有一个通用函数来捕获我的包中包含的所有异常 logR::tryCatch2 定义为:

tryCatch2 <- function(expr){
V=E=W=M=I=NULL
e.handler = function(e){
E <<- e
NULL
}
w.handler = function(w){
W <<- c(W, list(w))
invokeRestart("muffleWarning")
}
m.handler = function(m){
attributes(m$call) <- NULL
M <<- c(M, list(m))
}
i.handler = function(i){
I <<- i
NULL
}
V = suppressMessages(withCallingHandlers(
tryCatch(expr, error = e.handler, interrupt = i.handler),
warning = w.handler,
message = m.handler
))
list(value=V, error=E, warning=W, message=M, interrupt=I)
}

正如您在最后一行中看到的,它返回一个或多或少是自我描述的列表。
它对 tryCatch2 之后延迟的异常做出真正的 react 。调用电话简单 !is.null :
f = function(){ warning("warn1"); warning("warn2"); stop("err") }
r = tryCatch2(f())
if(!is.null(r$error)) cat("Error detected\n")
# Error detected
if(!is.null(r$warning)) cat("Warning detected, count", length(r$warning), "\n")
# Warning detected, count 2

它按预期工作,我可以用我自己的代码使用react。但在某些情况下,我不想停止也被捕获的中断过程。目前看来我需要向 tryCatch2 添加其他参数这将控制是否应该捕获中断。所以问题询问了一些 invokeInterrupt我可以通过以下方式使用的功能:
g = function(){ Sys.sleep(60); f() }
r = tryCatch2(g())
# interrupt by pressing ctrl+c / stop while function is running!
if(!is.null(r$interrupt)) cat("HERE I would like to invoke interrupt\n")
# HERE I would like to invoke interrupt

我认为如果 R 能够捕获一个,它也应该能够调用一个。
我怎样才能达到 invokeInterrupt功能?

最佳答案

我可以提出一个部分解决方案,它依赖于 tools包裹。

invokeInterrupt <- function() {
require(tools)
processId <- Sys.getpid()
pskill(processId, SIGINT)
}

但是,请注意使用 SIGINT 抛出中断信号 ( pskill )似乎不是很健壮。我通过发送异常并用您的函数捕获它来运行一些测试,如下所示:
will_interrupt <- function() {
Sys.sleep(3)
invokeInterrupt()
Sys.sleep(3)
}

r = tryCatch2(will_interrupt())

在 linux 上,从 R 命令行执行时效果很好。在 Windows 上,R 命令行和 R Gui 在执行此代码时确实关闭了。更糟糕的是:在 linux 和 windows 上,此代码立即使 Rstudio 崩溃......

因此,如果您的代码要在 Linux 上从 R 命令行执行,那么这个解决方案应该没问题。否则你可能会倒霉...

关于r - 从 R 代码调用中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820534/

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