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 <dwinsem...@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@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
______________________________________________
R-help@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.