[R] Returning to parent function

Martin Morgan mtmorgan at fredhutch.org
Wed Mar 18 02:15:18 CET 2015


On 03/16/2015 05:05 PM, Saptarshi Guha wrote:
> Example was complicated, but here is a simpler form
>
> continueIfTrue <- function(mm=return()){
>      eval(mm)
> }
> telemStats <- function(){
>      y <- substitute(return())
>      continueIfTrue(y)
>      print("I would not like this message to be printed")
> }
> telemStats()
>
>
> Ideally, calling telemStats() should return to the prompt and the
> print in telemStats should not appear

here's one way to implement your original example -- signal and handle, via 
tryCatch(), a custom condition created (modelled after simpleCondition()) as an 
S3 class with linear inheritance.

X <- function() {
     print("I'm saying...")
     signalCondition(structure(list(), class=c("my", "condition")))
     print("X")
}

Y <- function(){
     tryCatch(XParent(), my=function(...) NULL)
     print("hello")
}

XParent <- function(){
     X()
     print("H")
}

leading to

   > Y()
   [1] "I'm saying..."
   [1] "hello"

callCC() is tricky for me to grasp, but I'll write Y to accept an argument X, 
which will be a function. It'll call XParent with that function, and XParent 
will use the function.

Y <- function(X){
     XParent(X)
     print("hello")
}

XParent <- function(X){
     X("fun")
     print("H")
}

then we've got

   > Y(X)
   Error in XParent(X) (from tmp.R!4361C1Y#2) : object 'X' not found
   > Y(function(x) print("X"))
   [1] "X"
   [1] "H"
   [1] "hello"

but more interestingly the long jump to the top (where callCC was invoked)

   > callCC(function(X) { Y(X) })
   [1] "fun"

or in a function

   y <- function() {
       value <- callCC(function(X) {
           Y(X)
       })
       print(value)
       print("done")
   }

Hope that helps and is not too misleading. Excellent question.

Martin

>
>
> On Mon, Mar 16, 2015 at 4:02 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>>
>> On Mar 16, 2015, at 3:08 PM, Saptarshi Guha wrote:
>>
>>> Hello,
>>>
>>> I would like a function X to return to the place that called the
>>> function XParent that called this function X.
>>>
>>> Y calls XParent
>>> Y = function(){
>>>   XParent()
>>>   print("hello")
>>> }
>>>
>>> XParent calls X
>>>
>>> XParent = function(){
>>>    X()
>>>    print("H")
>>> }
>>>
>>> X returns to the point just after the call to XParent. Hence
>>> print("H") is not called, but instead "hello" is printed.
>>
>> ?sys.call # my second reading of your question makes me think this wasn't what was requested.
>>
>> ?return  # this would do what was asked for
>>
>>> XParent = function(){
>> +   return(sys.call())
>> +   print("H")
>> + }
>>> Y()
>> [1] "hello"
>>
>> # Success
>> # now to show that a value could be returned if desired
>>
>>> Y = function(){
>> +  print(XParent())
>> +  print("hello")
>> + }
>>> XParent = function(){
>> +   return(sys.call())
>> +   print("H")
>> + }
>>> Y()
>> XParent()
>> [1] "hello"
>>
>>
>>>
>>> X returns to the point just after the call to XParent. Hence
>>> print("H") is not called, but instead "hello" is printed.
>>>
>>> An example of what i'm going for is this
>>>
>>> continueIfTrue <- function(filterExp, grpname, subname,n=1){
>>>     y <- substitute(filterExp)
>>>     res <- isn(eval(y, envir=parent.frame()),FALSE)
>>>     ## if res is FALSE, I would like to return from telemStats
>>> }
>>>
>>> telemStats <- function(a,b){
>>>     b <- c(10,12)
>>>     continueIfTrue( {    length(b) >=10 }, "progStats","00")
>>>     print("Since the above condition failed, I would not like this
>>> message to be printed")
>>> }
>>
>> I'm afraid there were too many undefined objects to make much sense of that example.
>>
>>>
>>> I looked into callCC and signals but dont think i understood correctly.
>>> Any hints would be appreciated
>>>
>>> Kind Regards
>>> Saptarshi
>>>
>> --
>>
>> David Winsemius
>> Alameda, CA, USA
>>
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>


-- 
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



More information about the R-help mailing list