[R] Functions within functions in R and S-Plus

Sundar Dorai-Raj sundar.dorai-raj at pdf.com
Tue Jun 7 19:11:54 CEST 2005



Victor Gravenholt wrote:
> Sorry to bother you about a S-Plus related problem, but I hope someone 
> can help.
> I have tried to "translate" some code from R to S-Plus (I have colleague 
> that insists on using S-Plus. And yes, I have tried to make him change 
> to R...)
> The following code works out fine in R, but in S-Plus (S-PLUS 6.2 for 
> Windows Professional Ed.) I get the error message "Problem in 
> est.theta(x): Object "func" not found ".
> I have tried to keep most of the structure in my original problem (but 
> simplified it!), so the code could seem a bit strange.
> I suspect that this has something to do with different scoping rules in 
> R and S-Plus, but still I have not found a workable solution in S-Plus.
> 
> mainfunc <- function(x){
> 
> est <- function(x,par){
> abs(sum(par*x))
> }
> 
> func <- function(par,x){
>    est(x,par)
> }
> 
> est.theta <- function(x){
>    optimize(func,lower=-10, upper=20,x=x)$minimum
>    }
> 
> est.theta(x)
> 
> }
> 
> x <- 1:10
> mainfunc(x)
> 
> 
> 

You need to supply func to est.theta. R uses scoping to find func and 
est. S-PLUS scoping is defined differently and cannot, so you must 
assign them to the current frame.

is.R <- !is.null(version$language)
mainfunc <- function(x) {
   est <- function(x, par) {
     abs(sum(par * x))
   }
   func <- function(par, x) {
     est(x, par)
   }
   est.theta <- function(x) {
     optimize(func, lower = -10, upper = 20, x = x)$minimum
   }
   if(!is.R) {
     assign("func", func, frame = 1)
     assign("est", est, frame = 1)
   }
   est.theta(x)
}
mainfunc(1:10)

--sundar




More information about the R-help mailing list