Re: Set in Scan
- To: mathgroup at smc.vnet.net
- Subject: [mg21908] Re: Set in Scan
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Fri, 4 Feb 2000 02:54:39 -0500 (EST)
- References: <87aua2$ntf@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Johannes: Let's take a specific exmple: {v1, v2, v3} = {{1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1, 1}}; Scan[(#[[3]] = new) &, {v1, v2, v3}] (*1*) Set::"setps": "\!\({1, 1, 1}\) in assignment of part is not a symbol." ..... We can make this work (explanation at STEPS TO (*2*) below): Scan[(#[[3]] = new) &, Unevaluated /@ Hold[v1, v2, v3]] (*2*) {v1, v2, v3} {{1, 1, new}, {1, 1, new, 1}, {1, 1, new, 1, 1}} HOWEVER, the following may be convenient and quicker if it is a matter of replacements in a fixed list of lists structure: vs = {v1, v2, v3}; vs[[All, 3]] = n2; (*3*) vs {{1, 1, n2}, {1, 1, n2, 1}, {1, 1, n2, 1, 1}} STEPS TO (*2*) 1) #[[3]]= new& is read as #[[3]]= (new&), change to (#[[3]]= new& ). 2) The form aa[[..]] = bb requires aa to be a symbol to which a value has been assigned with aa = val (not aa := val). This is because the evalution works on the stored value. In (*1*) the vi evaluate and so, for example we get {1,1,1}[[3]] =new, which does not work. 3) So, why the following? Scan[(#[[3]] = new) &, Hold[v1, v2, v3]] Set::"setps": "\!\({1, 1, new}\) in assignment of part is not a symbol." .......... It seems that Scan ignores Hold. (the mechanism is (#[[3]]= new)&[v1) \[LongRightArrow] (#[[3]]= new)&[{1,1,1}]) \[LongRightArrow] {1,1,1}[[3]]= new (which fails) ) 4) Hence Scan[(#[[3]] = new) &, Unevaluated /@ Hold[v1, v2, v3]] Now we get #[[3]]= new)&[Unevaluated[v1]) \[LongRightArrow] v1[[3]] =new (which works!). Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 "Johannes Ludsteck" <ludsteck at zew.de> wrote in message news:87aua2$ntf at smc.vnet.net... > Dear MathGroup members > > I have to do replacements in very long lists. An efficient way to do > this is to use > > x[[index]]=newElement. > > This, however, doesn't work if I want to do replacements for a set of > lists. If I try to replace the third element in the lists v1, v2 and v3 by > typing > > Scan[#[[3]] = newElement &, {v1,v2,v3}] > I get the error message > Set::setps: #1 in assignment of part is not a symbol. > > Any suggestions? > Thanks > > > Johannes Ludsteck > Centre for European Economic Research (ZEW) > Department of Labour Economics, > Human Resources and Social Policy > Phone (+49)(0)621/1235-157 > Fax (+49)(0)621/1235-225 > > P.O.Box 103443 > D-68034 Mannheim > GERMANY > > Email: ludsteck at zew.de >