是否有退出当前R脚本的功能,但不退出整个执行?
我的意思是,在这种情况下:
for (i in ...) {
...
source("model.R")
}
在文件model.R
中,我需要exit
函数来结束model.R
的执行:
...
exit
...
所以stop
和stopifnot
是不可能的......
答案 0 :(得分:6)
以这种方式使用source似乎很不寻常 - 它使用它分配给它的任何符号来填充它运行的环境,因此多次调用source很容易产生意想不到的副作用。相反,我会遵循@ JoshuaUlrich的建议,并将脚本表示为(可重用,可能更模块化)的功能。但是对于它的价值,在“model.R”中创建并发出“条件”信号
cond = structure(list(message="I'm done"), class=c("exit", "condition"))
signalCondition(cond)
并在采购时抓住
tryCatch(source("model.R"), exit=function(cond) {
message("finished because:", conditionMessage(cond))
})
通过定义exit()
函数
exit <- function(message=character(), class="exit") {
cond <- structure(list(message=message), class=c(class, "condition"))
signalCondition(cond)
}
for (i in 1:5) {
## model.R simply invokes exit() or exit("I'm done") or exit(class="alt")
## if tryCatch wanted to handle conditions of class 'alt', too.
tryCatch(source("model.R"), exit=message)
}
我想invokeRestart()
解决方案更直接;上述的优点是有机会表明提前退出的原因。
答案 1 :(得分:4)
一种选择是在源文件中使用invokeRestart
,并使用source
将调用包装到withRestarts
。例如:
t <- tempfile()
write(file=t, "
message('source A')
invokeRestart('terminate')
message('source B')
")
for (i in 1:3) {
message(i)
if (i == 2)
withRestarts(source(t), terminate=function() message('terminated'))
}
# 1
# 2
# source A
# terminated
# 3
unlink(t)
答案 2 :(得分:2)
似乎到目前为止最简单的解决方案是将源代码脚本中的整个代码包装成一个循环,然后从中断:
model.R
(来源脚本):
repeat {
...
break # this will exit the sourced script
...
break # just to prevent infinite loop in case the above break is removed
}
感谢Joshua Ulrich的灵感(他建议使用一种功能)。