Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R: Exit from the calling function

Tags:

r

In R, is there a way to exit from the calling function and return a value? Something like return(), but from the parent function?

parent <- function(){
  child()
  # stuff afterward should not be executed
} 

child <- function(){
  returnFromParent("a message returned by parent()")
}

It seems stop() is doing something like that. What I want to do is to write a small replacement for stop() that returns the message that stop() writes to stderr.

Update after G5W's suggestion: I have a large number of checks, each resulting in a stop() if the test fails, but subsequent conditions cannot be evaluated if earlier checks fail, so the function must exit after a failing one. To do this 'properly', I would have to build up a huge if else construct, which I wanted to avoid.

like image 368
chris Avatar asked Dec 04 '16 23:12

chris


People also ask

How do you exit an R code?

To quit R you can either use the RStudio > Quit pull-down menu command or execute ⌘ + Q (OS X) or ctrl + Q (PC).


Video Answer


1 Answers

Disclaimer: This sounds a XY problem, printing the stop message to stdout has few to no value, if interactive it should not be a problem, if in a script just use the usual redirection 2 > &1 to write stderr messages to stdout, or maybe use sink as in answer in this question.

Now, if I understood properly what you're after I'll do something like the following to avoid too much code refactoring.

First define a function to handle errors:

my_stop <- function() {
 e <- geterrmessage()
 print(e)
}

Now configure the system to send errors to your function (error handler) and suppress error messages:

options(error = my_stop)
options(show.error.messages=FALSE)

Now let's test it:

f1 <- function() {
  f2()
  print("This should not be seen")
}

f2 <- function() {
  stop("This is a child error message")
}

Output:

> f1()
[1] "Error in f2() : This is a child error message\n"
like image 166
Tensibai Avatar answered Sep 30 '22 19:09

Tensibai