[R] <<- how/when/why do you use it?

Greg Snow Greg.Snow at imail.org
Thu Apr 15 22:14:00 CEST 2010


Thanks Gabor, I had not thought of using environments like that.  It looks like it can be done even simpler:

fun3 <- function() {

	e <- environment()
	tmp <- matrix( nrow=0, ncol=2 )

	fun4 <- function(x) {
		e$tmp <- rbind(e$tmp, x)
		(x[1] - 3)^2 + (x[2]-5)^2
	}

	out <- optim( c(0,0), fun4 )
	list( out=out, vals=tmp )
}

tmp <- fun3()
plot( tmp$vals, type='l' )

Now I can start removing all the "<<-"s from my code.

-- 
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111


> -----Original Message-----
> From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com]
> Sent: Wednesday, April 14, 2010 11:36 AM
> To: Greg Snow
> Cc: Tal Galili; r-help at r-project.org
> Subject: Re: [R] <<- how/when/why do you use it?
> 
> 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.
> >



More information about the R-help mailing list