终止R脚本时的清理

终止R脚本时的清理,r,code-cleanup,R,Code Cleanup,我有一个R脚本,有时我不得不“杀死”它来停止执行。但在“杀死”它时,执行清理(关闭连接等)的代码不会执行。 如何确保无论脚本如何停止,都执行清理代码 我的脚本是myTest.R: print("script called") Sys.sleep(20) .Last<-function() { print("Last called") } 如果我等待20秒,将调用.Last函数 现在,有时我必须通过调用以下命令来中断脚本的执行: kill -USR1 pid 其中pid是流程id。

我有一个R脚本,有时我不得不“杀死”它来停止执行。但在“杀死”它时,执行清理(关闭连接等)的代码不会执行。 如何确保无论脚本如何停止,都执行清理代码

我的脚本是myTest.R:

print("script called")

Sys.sleep(20)

.Last<-function()
{
 print("Last called")
}
如果我等待20秒,将调用.Last函数

现在,有时我必须通过调用以下命令来中断脚本的执行:

kill -USR1 pid
其中pid是流程id。此调用记录在此处:

这将终止进程,但未调用.Last函数。但是文件上说应该调用它。我错过了什么。请帮忙。哦,我正在Linux上运行它


谢谢

您将在
条件下找到所有可能的错误处理方法。
一种可能性是使用
tryCatch
,允许您使用定义的表达式或值失败:

library(parallel)          
cl <- makeCluster(2)
test <- function(x) {
  2+x
  e <- simpleError("test error")
  stop(e)
}
# I do not stop the connection to the cluster in  test()
tryCatch(test(2), finally = stopCluster(cl))
#but after failing a call to 
stopCluster(cl) #gives,
Error in summary.connection(connection) : invalid connection
# because with tryCatch it fails with closing the connections
库(并行)

cl在我们可以将中断发送到R之前,需要定义最后一个函数。因此,它应该是:

print("script called")

.Last<-function()
{
 print("Last called")
} 

Sys.sleep(20)
print(“脚本调用”)

.Last软件包
fork
mulicore
可能会提供一些见解()和(cran.r-project.org/web/packages/fork/fork.pdf),特别是在
的定义中。Last
函数是执行的最后一步脚本是什么,您是如何运行它的(
source
,从命令行等等)?谢谢。我已经用一个示例脚本记录了这个问题,以及我解决它的方式。我还添加了对相关帮助文档的引用。如果您需要更多信息,请告诉我。谢谢。我应该说清楚的。我在上面的问题中添加了更多信息。我不是从脚本本身阻止它,而是从命令行杀死它
print("script called")

.Last<-function()
{
 print("Last called")
} 

Sys.sleep(20)