[R] return() in nested functions

Duncan Murdoch murdoch at stats.uwo.ca
Sat Jul 14 13:31:47 CEST 2007

```On 14/07/2007 7:16 AM, Mark Hempelmann wrote:
> Dear WizaRds,
>
> 	After consulting different sources I am still unable to understand the
> correct use of return() in nested functions. To illustrate the problem:

return() knows nothing about nested functions.  It just returns from the
current function.

In most respects, nested functions are just like any other functions in
R.  The only important difference is the attached environment, which
affects what is visible from within the function, and where <<- stores
results.

>
> f <- function(x,y,type){
>
> 	est1<-function(x,y){
> 	z=x+y
> 	out(x,y,z)}
>
> 	est2<-function(x,y){
> 	z=x*y
> 	out(x,y,z)}
>
> 	out<-function(x,y,z)
> 	return(x,y,z)

Don't ignore the warning you saw from this!  Deprecated things
eventually become defunct. You want return(list(x, y, z))

>
> if (type=="est1") est1(x,y)
> if (type=="est2") est2(x,y)
> }
>
> test<-f(1,2,type="est1") # gives Null for test

The result of the first if is the value from the call to est1.  The
result of the second if is NULL.  That's what your function returned.

If you had wrapped those calls in return() you'd get what I think you
expected:

if (type=="est1") return(est1(x,y))
if (type=="est2") return(est2(x,y))

because the return() causes the function to exit and return a value.

Duncan Murdoch

>
> However, without the second 'if' condition, it works properly:
> Warning message:
> multi-argument returns are deprecated in: return(x, y, z)
>> test
> \$x
> [1] 1
> \$y
> [1] 2
> \$z
> [1] 3
>
> Basically, the function I am working on is of the above structure, be it
> more complex. I would like f to return the results of function 'out' to
> the user in the assigned variable, e.g. 'test'. i did consult try() and
> tryCatch(), but it doesn't seem to be what I am looking for.
>
> Thank you for your help and understanding
> mark
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help