我有一个程序可以进行一些数据分析并且只有几百行。
在程序的早期,我想做一些质量控制,如果没有足够的数据,我希望程序终止并返回到R控制台。否则,我希望其余代码执行。
我尝试了break
,browser
和quit
,但没有一个停止执行其余的程序(quit
也会停止执行完全放弃R,这不是我想要发生的事情)。我的最后一招是创建一个if-else
语句如下:
if(n < 500){}
else{*insert rest of program here*}
但这似乎是糟糕的编码习惯。我错过了什么吗?
答案 0 :(得分:48)
如果您希望程序产生错误,可以使用stopifnot()
函数:
foo <- function(x) {
stopifnot(x > 500)
# rest of program
}
答案 1 :(得分:11)
反转你的if-else结构:
if(n >= 500) {
# do stuff
}
# no need for else
答案 2 :(得分:7)
编辑:似乎OP正在运行一个长脚本,在这种情况下,只需要在质量控制之后用
包装脚本部分if (n >= 500) {
.... long running code here
}
如果突破功能,您可能只是明确地或隐含地想要return()
。
例如,显式双返回
foo <- function(x) {
if(x < 10) {
return(NA)
} else {
xx <- seq_len(x)
xx <- cumsum(xx)
}
xx ## return(xx) is implied here
}
> foo(5)
[1] 0
> foo(10)
[1] 1 3 6 10 15 21 28 36 45 55
隐含return()
,我的意思是最后一行就像您已完成return(xx)
一样,但暂停return()
的呼叫效率稍高一些
有些人考虑使用多种不良风格;在长函数中,跟踪函数退出的位置可能变得困难或容易出错。因此,另一种方法是使用单个返回点,但使用if () else ()
子句更改返回对象。对foo()
的这种修改将是
foo <- function(x) {
## out is NA or cumsum(xx) depending on x
out <- if(x < 10) {
NA
} else {
xx <- seq_len(x)
cumsum(xx)
}
out ## return(out) is implied here
}
> foo(5)
[1] NA
> foo(10)
[1] 1 3 6 10 15 21 28 36 45 55
答案 3 :(得分:5)
不漂亮,但这里有一种在R中实现exit()
命令的方法,对我有用。
exit <- function() {
.Internal(.invokeRestart(list(NULL, NULL), NULL))
}
print("this is the last message")
exit()
print("you should not see this")
只是轻度测试,但是当我运行它时,我看到this is the last message
然后脚本中止而没有任何错误消息。
答案 4 :(得分:3)
也许你只是想在某个时候停止执行一个长脚本。即。就像你想在C或Python中硬编码exit()一样。
print("this is the last message")
stop()
print("you should not see this")
答案 5 :(得分:1)
您可以使用pskill
“工具”包中的R
函数来中断当前进程并返回控制台。具体来说,我在每个脚本开头的源文件中定义了以下函数。但是,您也可以直接在代码的开头复制它。然后在代码中的任意位置插入halt()
以立即停止脚本执行。这个函数在GNU / Linux上运行良好,从R
文档判断,它也可以在Windows上运行(但我没有检查)。
# halt: interrupts the current R process; a short iddle time prevents R from
# outputting further results before the SIGINT (= Ctrl-C) signal is received
halt <- function(hint = "Process stopped.\n") {
writeLines(hint)
require(tools, quietly = TRUE)
processId <- Sys.getpid()
pskill(processId, SIGINT)
iddleTime <- 1.00
Sys.sleep(iddleTime)
}
答案 6 :(得分:1)
这是一个老问题,但还没有一个干净的解决方案。这可能不是回答这个具体问题,但那些寻找“如何优雅地退出R脚本”的答案的人可能会落在这里。似乎R开发人员忘了实现exit()函数。无论如何,我发现的技巧是:
continue <- TRUE
tryCatch({
# You do something here that needs to exit gracefully without error.
...
# We now say bye-bye
stop("exit")
}, error = function(e) {
if (e$message != "exit") {
# Your error message goes here. E.g.
stop(e)
}
continue <<-FALSE
})
if (continue) {
# Your code continues here
...
}
cat("done.\n")
基本上,您使用标志来指示指定代码块的继续与否。然后使用stop()
函数将自定义消息传递给tryCatch()
函数的错误处理程序。如果错误处理程序收到您要正常退出的消息,那么它只是忽略该错误并将延续标志设置为FALSE
。
答案 7 :(得分:1)
我遇到了类似的问题:退出当前函数,但不想完成其余代码。 最后我通过一个只运行一次的 for() 循环解决了这个问题。在 for 循环中,您可以设置几个不同的条件来离开当前循环(函数)。
for (i in T) {
print('hello')
if (leave.condition) next
print('good bye')
}
答案 8 :(得分:0)
下面:
if(n < 500)
{
# quit()
# or
# stop("this is some message")
}
else
{
*insert rest of program here*
}
quit()
和stop(message)
都会退出您的脚本。如果您从R命令提示符处获取脚本,那么quit()
也将从R退出。