What's the best way to simulate Recall for parent function?
Consider this one-time recursive code:
alwaysEven <- function(x) {
handleOdd <- function(x) {
alwaysEven(x-1) # use Recall-like here
}
return(if (x %% 2) handleOdd(x) else x)
}
any2even <- alwaysEven
rm(alwaysEven)
any2even(3)
----------------------------------------------------------
SIGSIG -- signature too long (core dumped)
Here are two ways:
# method 1. nest an extra alwaysEven
alwaysEven <- function(x) {
alwaysEven <- function(x) {
handleOdd <- function(x) {
alwaysEven(x-1) # use Recall-like here
}
return(if (x %% 2) handleOdd(x) else x)
}
alwaysEven(x)
}
any2even <- alwaysEven
rm(alwaysEven)
any2even(3)
# method 2. sys.function
alwaysEven <- function(x) {
handleOdd <- function(x) {
sys.function(1)(x-1) # use Recall-like here
}
return(if (x %% 2) handleOdd(x) else x)
}
any2even <- alwaysEven
rm(alwaysEven)
any2even(3)
On 3/29/06, Paul Roebuck <roebuck at mdanderson.org>
wrote:> What's the best way to simulate Recall for parent function?
> Consider this one-time recursive code:
>
> alwaysEven <- function(x) {
> handleOdd <- function(x) {
> alwaysEven(x-1) # use Recall-like here
> }
>
> return(if (x %% 2) handleOdd(x) else x)
> }
> any2even <- alwaysEven
> rm(alwaysEven)
> any2even(3)
>
> ----------------------------------------------------------
> SIGSIG -- signature too long (core dumped)
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html
>
On Wed, 29 Mar 2006, Paul Roebuck wrote:> What's the best way to simulate Recall for parent function? > Consider this one-time recursive code: > > alwaysEven <- function(x) { > handleOdd <- function(x) { > alwaysEven(x-1) # use Recall-like here > } > > return(if (x %% 2) handleOdd(x) else x) > } > any2even <- alwaysEven > rm(alwaysEven) > any2even(3)You can make anonymous recursive functions with local() whatever <- local({ alwaysEven <- function(x) { handleOdd <- function(x) { alwaysEven(x-1) } return(if (x %% 2) handleOdd(x) else x) } alwaysEven }) -thomas Thomas Lumley Assoc. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle