Re: Re: Can't assign value to symbols
- To: mathgroup at smc.vnet.net
- Subject: [mg58463] Re: [mg58444] Re: [mg58409] Can't assign value to symbols
- From: "David Park" <djmp at earthlink.net>
- Date: Sun, 3 Jul 2005 03:57:18 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Lee, You should then probably go with a solution that generates a set of replacement rules. Use Rule instead of Set and save the set of rules. I'm always advising users to not set values for single character symbols because they are too valuable as symbols - but I forgot to think of that in this case. parameters = {{a, b, c}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; rules[n_] := MapThread[(#1 -> #2) & , {parameters[[1]], parameters[[n]]}] rules[2] {a -> 1, b -> 2, c -> 3} a b c^2 % /. rules[2] a*b*c^2 18 a b c^2; % /. rules[3] 720 a b c^2; % /. rules[4] 4536 David Park djmp at earthlink.net http://home.earthlink.net/~djmp/ From: Lee Newman [mailto:leenewm at umich.edu] To: mathgroup at smc.vnet.net Thanks for the solutions. I'm running with David Park's solution, but now realize there is one additional problem. Once I've executed the statement MapThread[(#1 = #2) & , {parameters[[1]], parameters[[3]]}] , because I've specified the first row of "parameters" as symbols, this row now loses the symbol names and takes on the assigned values, such that my attempt to execute the MapThread Statement again for a different set of values, e.g. parameters[[2]], fails. in: MapThread[(#1 = #2) & , {parameters[[1]], parameters[[3]]}] ; in: {a,b,c} Out: {4,5,6} in: MapThread[(#1 = #2) & , {parameters[[1]], parameters[[2]]}] ; out: Set:: setraw : Cannot assign to raw object 4 ... etc I want to preserve the first row of "parameters" as the symbol names, so one solution is to use strings, and modify David Park's solution to turn the strings into symbol names when assigned, This works the first time it is run, and parameters[[1]] still contains the strings, but ut still fails the second time. but why? in: parameters = {{"a", "b", "c"}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; in: MapThread[(#1 = #2) & , {ToExpression /@ parameters[[1]], parameters[[3]]}] ; in: {a,b,c} out {4,5,6} in: MapThread[(#1 = #2) & , {ToExpression /@ parameters[[1]], parameters[[3]]}] ; out: Set:: setraw : Cannot assign to raw object 4 ... etc why does the MapThread statement fail the second time? It seems ToExpression/@parameters[[1]] converts the strings "a", "b", "c" to symbols but then evaluates them prior to returning them, so the attempt to assign to them in MapThread fails. How can I modify the MapThread statement so I can call it multiple times, each time assigning values to the symbols identified by the strings in the first row?? Lee David Park wrote: > Lee, > > Set (=) has a higher precedence Than Function (&). So all you have to do is > add parentheses. > > parameters = {{a, b, c}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; > > MapThread[(#1 = #2) & , {parameters[[1]], parameters[[3]]}] > {4, 5, 6} > > David Park > djmp at earthlink.net > http://home.earthlink.net/~djmp/ > > From: Lee Newman [mailto:leenewm at umich.edu] To: mathgroup at smc.vnet.net > > > Hello, > > Situation: I have a table that contains parameters and sets of values > that I want to assign to the parameters for the purposes of running a > simulation. > - parameters = {{a,b,c},{1,2,3},{4,5,6},{7,8,9}} > - want to assign values in a given row to the symbols listed in the > first row. > - tried using: MapThread[ #1 = #2 &, {parameters[[1]], parameters[[3]]} ] > - fails with error "Tag Slot in #1 is Protected" > - tried adding Unprotect[#1] and a variety of other attemps, but can't > get it to work. > > Anyone know how might accomplish this? > > Thanks, > Lee > >