> On Dec 23, 2015, at 12:44 AM, Matteo Richiardi <matteo.richia...@gmail.com> 
> wrote:
> 
> I am following the example I find on ?assign:
> 
> a <- 1:4
> assign("a[1]", 2)


You appear to have completely misinterpreted the intent of the authors of that 
help page. The next two lines in that example (which you omitted) show that 
they intended you to see this as a demonstration of what NOT to do:

a <- 1:4
assign("a[1]", 2)
a[1] == 2          # FALSE
get("a[1]") == 2   # TRUE

Notice that a[1] was not assigned the value of 2 as demonstrated when the 
logical test returning FALSE, but that that an object with the pathological 
name `a[1]` was created.


> This appears to create a new variable named "a[1]" rather than
> changing the value of the vector.
> 
> Am I missing something here? How can I assign a value to a specified
> element of a vector/matrix?
> 
> Of course, my problem is slightly more involved, but I guess the above
> is its core. For those interested, I have the two matrixes
> M_a <- matrix(0,10,10)
> M_b <- matrix(0,10,10)
> 
> I want to have a function that assigns a value to a specific element
> of one of the matrix, as in
> foo <- function(s,i,j,value){
>  assign(paste("M_",s)[i,j],value)
> }

I see that Peter Antoni and John Fox have offered a demonstration of how to use 
get and assign. 


Those efforts at macro-ization are essentially recapitulating what happens when 
using:

M_a[5,5] <- value

The M_a object is looked up, copied to something named `*tmp*`, and then the 
assignment within that copy is performed and the value copied back into M_a. 
These semantics with there attendant inefficiencies have prompted the 
development of the data.table package where the assignments are done in place.


The alternate strategy of Giorgio Garzanio calls to mind this fortune:

> fortunes::fortune("parse()")

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)


See pages 11-13 of https://cran.r-project.org/doc/Rnews/Rnews_2001-3.pdf to see 
how Lumley expands on this theme.


-- 
David.


> 
> This however does not work:
> 
> foo('a',1,1,1)
> 
> Error in paste("M_", s)[1, j] : incorrect number of dimensions
> 
> Following the ?assign help, I tried
> 
> foo2 <- function(s,i,j,value){
>  assign(paste("M_",s,"[i,j]"),value, envir = .GlobalEnv)
> }
> 
> but this produces the problem I described above (namely, a new
> variable is created, rather than replacing the specified element of
> the matrix).
> 
> I know that in this example I could simply pass the matrix as an
> argument to the function, but I am interested in understanding how
> 'assign' work.
> 
> Many thanks for your help.
> 
> Matteo
> 
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.

David Winsemius
Alameda, CA, USA

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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