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

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
>
> 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
>
> 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
>
>

```

• Prev by Date: Re: how to find n in expression x^n using a pattern?
• Next by Date: Re: Can't assign value to symbols
• Previous by thread: Re: Re: Can't assign value to symbols
• Next by thread: Re: Can't assign value to symbols