> -----Original Message-----
> From: r-help-boun...@r-project.org 
> [mailto:r-help-boun...@r-project.org] On Behalf Of Ivo Shterev
> Sent: Friday, August 07, 2009 9:36 AM
> To: murd...@stats.uwo.ca; markle...@verizon.net
> Cc: r-help@r-project.org
> Subject: Re: [R] A question regarding R scoping
> 
> 
> Dear All,
> 
> Sorry for the introduced confusion. My question is to have a 
> function (in my case f1) that just takes an argument and 
> modifies it (no copies, no returns). This can be done by:
> 
> f1 = function(i){i <<- 1}
> 
> Then this function is called by another function (in my case 
> f2) that just initializes the above mentioned argument and 
> calls f1, like this
> 
> f2 = function(n){
> ##whatever initialization on i
> f1(i)
> print(i)
> }
> 
> Obviously in my code example f1 "loses" its ability to modify 
> its argument, so the question is how to modify f2 so that it 
> prints out 1. 

In general, S functions do not modify their arguments.
However functions defined in the form
     `f`1<-` <- function(x, ..., value) { # last argument must be called
'value'
          newx <- someFunctionOf(x, ..., value)
          newx
     }
and called as
     f1(x) <- myValue
will alter x, giving it the value of someFunctionOf(x,myValue).
(Do not call `f1<-` directly, as new<-`f1<-`(x,value=value).) 

In any case, only things on the left side of the
assignment operator will be assigned to.

If you write such a 'replacement function' it is good form to write
an extraction function to do the inverse, as then you can nest
the replacement function calls, as in f1(x)[1:2] <- myValue.

In your case you could write such a function that ignored the
value argument and just returned 1
     `f1<-` <- function(x, value)   1
but you would have to call it in the required form
     f1(x) <- "ignoredValue"
E.g.,
    > `f1<-` <- function(x, value) 1
    > x<-c(pi, 1i, exp(1))
    > k
    [1] 3.141593+0i 0.000000+1i 2.718282+0i
    > f1(k) <- "ignored"
    > k
    [1] 1

You might make use of the value argument so that, e.g., 'initial' meant
to give a suitable starting value and 'terminal' would give it whatever
value meant the procedure was over.  The extraction function could
then return 'initial' or 'terminal' or 'in progress'.

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com  

> 
> -ivo
> ... 

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to