Hi all, Today I came across scoping in the R intro<http://cran.r-project.org/doc/manuals/R-intro.html#Scope> (after reading Robert Gentleman fortune<http://rfortunes.posterous.com/im-always-thrilled-when-people-discover-what> on lexical scooping) , and am very curious about the <<- assignment. The manual showed one (very interesting) example for "<<-", which I feel I understood. What I am still missing is the context of when this can be useful. So what I would love to read from you are examples (or links to examples) on when using "<<-" can be interesting/useful. What might be the dangers of using it (it looks easy to loose track of), and any tips you might feel like sharing. Thanks, Tal ----------------Contact Details:------------------------------------------------------- Contact me: Tal.Galili@gmail.com | 972-52-7275845 Read me: www.talgalili.com (Hebrew) | www.biostatistics.co.il (Hebrew) | www.r-statistics.com (English) ---------------------------------------------------------------------------------------------- [[alternative HTML version deleted]]
On 13/04/2010 10:02 AM, Tal Galili wrote:> Hi all, > > Today I came across scoping in the R > intro<http://cran.r-project.org/doc/manuals/R-intro.html#Scope> (after > reading Robert Gentleman > fortune<http://rfortunes.posterous.com/im-always-thrilled-when-people-discover-what> > on > lexical scooping) , and am very curious about the <<- assignment. > > The manual showed one (very interesting) example for "<<-", which I feel I > understood. What I am still missing is the context of when this can be > useful. > > So what I would love to read from you are examples (or links to examples) on > when using "<<-" can be interesting/useful. What might be the dangers of > using it (it looks easy to loose track of), and any tips you might feel like > sharing. >It's useful in a couple of contexts. In a big function, sometimes you have repetitive operations on local variables: you can write local functions to do them, and modify the outer local variables using <<-. (See tools::Rd2HTML for lots of examples of this.) There's also the use of them as a way to get references to objects that maintain their state, by returning a function from a function: it can refer to and modify local variables in the outer function. This is used in the tkcanvas demo, for example. One thing to watch out for: if you have code like this: x <<- 1 # modifies a non-local ("outer") variable y <- x # assignment from outer x x <- 2 # creates a local x <<- 3 # modifies the outer one z <- x # assignment from local x then y will get 1, but z will get 2, even though the first and last pairs of lines look very similar. It's generally confusing to mix <<- assignments to outer variables with <- assignments to locals having the same name. Just use different names. Duncan Murdoch
The <<- assignment operator is very powerful, but can be dangerous as well. When tempted to use it, look for alternatives first, there may be a better way. But having said that, I am one of the more guilty people for using it (quite a few of the functions in the TeachingDemos package use <<-). The main use that I see is when you are using a function written by someone else that takes one of your functions as an argument and you want to save information from your function that is not being passed back through the calling function. For example you may want to trace the calls to your function that is being called by optim, just define your function A which defines within it function B which is to be optimized, A also contains an empty vector to store results in, then A calls optim passing B to it, B uses <<- to update the vector in A every time that it is called, now A has the results of optim and also a trace of info on all the calls to B. <<- can also be used for package local variables (less evil than globals) where within a package you can call one function to set some things up, then other functions in the package can refer to the variable created to see the setup as well as modifying options local to the package. Hope this helps, -- Gregory (Greg) L. Snow Ph.D. Statistical Data Center Intermountain Healthcare greg.snow at imail.org 801.408.8111> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- > project.org] On Behalf Of Tal Galili > Sent: Tuesday, April 13, 2010 8:03 AM > To: r-help at r-project.org > Subject: [R] <<- how/when/why do you use it? > > Hi all, > > Today I came across scoping in the R > intro<http://cran.r-project.org/doc/manuals/R-intro.html#Scope> (after > reading Robert Gentleman > fortune<http://rfortunes.posterous.com/im-always-thrilled-when-people- > discover-what> > on > lexical scooping) , and am very curious about the <<- assignment. > > The manual showed one (very interesting) example for "<<-", which I > feel I > understood. What I am still missing is the context of when this can be > useful. > > So what I would love to read from you are examples (or links to > examples) on > when using "<<-" can be interesting/useful. What might be the dangers > of > using it (it looks easy to loose track of), and any tips you might feel > like > sharing. > > Thanks, > Tal > > > ----------------Contact > Details:------------------------------------------------------- > Contact me: Tal.Galili at gmail.com | 972-52-7275845 > Read me: www.talgalili.com (Hebrew) | www.biostatistics.co.il (Hebrew) > | > www.r-statistics.com (English) > ----------------------------------------------------------------------- > ----------------------- > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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.
x <<- will usually wind up assigning into the parent or global environment but since it depends on what is already there the following are safer: e <- environment() parent.env(e)$x <- 1 globalenv()$x <- 2 Typically in cases like this the function that contains the assignment can be regarded as a method of the object containing x so an OO approach can be taken such as facilitated by the proto package. Here p is defined to be a proto object with method square.x and property x.> library(proto) > p <- proto(x = 2, square.x = function(.) .$x <- .$x^2) > p$x[1] 2> p$square.x() > p$x[1] 4 On Wed, Apr 14, 2010 at 11:42 AM, Greg Snow <Greg.Snow at imail.org> wrote:> The <<- assignment operator is very powerful, but can be dangerous as well. ?When tempted to use it, look for alternatives first, there may be a better way. ?But having said that, I am one of the more guilty people for using it (quite a few of the functions in the TeachingDemos package use <<-). > > The main use that I see is when you are using a function written by someone else that takes one of your functions as an argument and you want to save information from your function that is not being passed back through the calling function. ?For example you may want to trace the calls to your function that is being called by optim, just define your function A which defines within it function B which is to be optimized, A also contains an empty vector to store results in, then A calls optim passing B to it, B uses <<- to update the vector in A every time that it is called, now A has the results of optim and also a trace of info on all the calls to B. > > <<- can also be used for package local variables (less evil than globals) where within a package you can call one function to set some things up, then other functions in the package can refer to the variable created to see the setup as well as modifying options local to the package. > > Hope this helps, > > -- > Gregory (Greg) L. Snow Ph.D. > Statistical Data Center > Intermountain Healthcare > greg.snow at imail.org > 801.408.8111 > > >> -----Original Message----- >> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- >> project.org] On Behalf Of Tal Galili >> Sent: Tuesday, April 13, 2010 8:03 AM >> To: r-help at r-project.org >> Subject: [R] <<- how/when/why do you use it? >> >> Hi all, >> >> Today I came across scoping in the R >> intro<http://cran.r-project.org/doc/manuals/R-intro.html#Scope> (after >> reading Robert Gentleman >> fortune<http://rfortunes.posterous.com/im-always-thrilled-when-people- >> discover-what> >> on >> lexical scooping) , and am very curious about the <<- assignment. >> >> The manual showed one (very interesting) example for "<<-", which I >> feel I >> understood. What I am still missing is the context of when this can be >> useful. >> >> So what I would love to read from you are examples (or links to >> examples) on >> when using "<<-" can be interesting/useful. What might be the dangers >> of >> using it (it looks easy to loose track of), and any tips you might feel >> like >> sharing. >> >> Thanks, >> Tal >> >> >> ----------------Contact >> Details:------------------------------------------------------- >> Contact me: Tal.Galili at gmail.com | ?972-52-7275845 >> Read me: www.talgalili.com (Hebrew) | www.biostatistics.co.il (Hebrew) >> | >> www.r-statistics.com (English) >> ----------------------------------------------------------------------- >> ----------------------- >> >> ? ? ? [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at 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. > > ______________________________________________ > R-help at 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. >