break/exit script

前端 未结 8 1244
Happy的楠姐
Happy的楠姐 2021-01-30 15:22

I have a program that does some data analysis and is a few hundred lines long.

Very early on in the program, I want to do some quality control and if there is not enou

相关标签:
8条回答
  • 2021-01-30 16:00

    Perhaps you just want to stop executing a long script at some point. ie. like you want to hard code an exit() in C or Python.

    print("this is the last message")
    stop()
    print("you should not see this")
    
    0 讨论(0)
  • 2021-01-30 16:01

    Reverse your if-else construction:

    if(n >= 500) {
      # do stuff
    }
    # no need for else
    
    0 讨论(0)
  • 2021-01-30 16:05

    Edit: Seems the OP is running a long script, in that case one only needs to wrap the part of the script after the quality control with

    if (n >= 500) {
    
    .... long running code here
    
    }
    

    If breaking out of a function, you'll probably just want return(), either explicitly or implicitly.

    For example, an explicit double 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
    

    By return() being implied, I mean that the last line is as if you'd done return(xx), but it is slightly more efficient to leave off the call to return().

    Some consider using multiple returns bad style; in long functions, keeping track of where the function exits can become difficult or error prone. Hence an alternative is to have a single return point, but change the return object using the if () else () clause. Such a modification to foo() would be

    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
    
    0 讨论(0)
  • 2021-01-30 16:05

    Here:

    if(n < 500)
    {
        # quit()
        # or 
        # stop("this is some message")
    }
    else
    {
        *insert rest of program here*
    }
    

    Both quit() and stop(message) will quit your script. If you are sourcing your script from the R command prompt, then quit() will exit from R as well.

    0 讨论(0)
  • 2021-01-30 16:12

    You could use the stopifnot() function if you want the program to produce an error:

    foo <- function(x) {
        stopifnot(x > 500)
        # rest of program
    }
    
    0 讨论(0)
  • 2021-01-30 16:13

    This is an old question but there is no a clean solution yet. This probably is not answering this specific question, but those looking for answers on 'how to gracefully exit from an R script' will probably land here. It seems that R developers forgot to implement an exit() function. Anyway, the trick I've found is:

    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")
    

    Basically, you use a flag to indicate the continuation or not of a specified block of code. Then you use the stop() function to pass a customized message to the error handler of a tryCatch() function. If the error handler receives your message to exit gracefully, then it just ignores the error and set the continuation flag to FALSE.

    0 讨论(0)
提交回复
热议问题