[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