Sarah Gosless said
> But frequently there are better options than the
> use of get/assign for solving particular problems.

I tend to be more extreme say recommend that you forget
you ever heard of the get and assign functions.

First, out-of-the-local-evaluation-environment assignments
make for confusing code.  You can usually do what you
need to do by having functions that return values.
Replacement functions, defined with
   `something<-` <- function(x, ..., value) { x$something<-value; x }
and used as
   something(x) <- newSomething
can be used to alter an existing object.

Second, if you decide that you need to do an assignment
outside of the current evironment, you ought to know which
environment you want to use.  It is often .GlobalEnv.
Then you can use
   yourEnvironment[["itemName"]]
instead of
   get("itemName", envir=yourEnvironment)
and
   yourEnvironment[["itemName"]] <- itemValue
instead of
   assign("itemName", itemValue, envir=yourEnvironment)
The advantages of the [[ syntax are (a) it forces you
to decide where the data should be and (b) it lets you
use natural R syntax to modify objects.  E.g.,
   rownames(yourEnvironment[["itemName"]]) <- c("R1","R2")
will change the rownames of "itemName" in the environment
called yourEnvironment.

At somepoint you may decide to use a list instead of
an environment to hold your objects, in which case the
[[ syntax still works without any changes.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 
> -----Original Message-----
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
> Behalf Of Sarah Goslee
> Sent: Monday, February 27, 2012 9:58 AM
> To: Jannis
> Cc: r-help@r-project.org
> Subject: Re: [R] problem with assign and get
> 
> Hi,
> 
> On Mon, Feb 27, 2012 at 12:41 PM, Jannis <bt_jan...@yahoo.de> wrote:
> > Dear list members,
> >
> >
> > does anyone have an idea why the following construction does not work but
> > gives the following error message:
> >
> > assign('test', array(1:10, dim=c(10,10)))
> > dimnames(get('test')) <- list(1:10,1:10)
> >
> >
> > Error in dimnames(get("test")) <- list(1:10, 1:10) :
> >  target of assignment expands to non-language object
> 
> There's no object to assign dimnames to. Think about it
> this way - what do you expect the dimnames of to be
> changed? "test" has no dimnames; get("test") would
> print the object named "test", but how could you change
> the dimnames of a displayed object?
> 
> If you want to change the dimnames of the object named
> "test", you first need to use get("test") to assign that object
> to a new object, then change the dimnames, then assign
> the changed object to the desired name.
> 
> myobject <- get("test")
> dimnames(myobject) <- list(1:10, 1:10)
> assign("test", myobject)
> 
> Note: I'm assuming your small reproducible example (thank
> you!) is a surrogate for something more complex, so that
> dimnames(test) <- list(1:10, 1:10) is not an acceptable
> solution. But frequently there are better options than the
> use of get/assign for solving particular problems.
> 
> Sarah
> 
> --
> Sarah Goslee
> http://www.functionaldiversity.org
> 
> ______________________________________________
> 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.

______________________________________________
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