Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Re: Re: Can't assign value to symbols

  • To: mathgroup at smc.vnet.net
  • Subject: [mg58518] Re: [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] Can't assign value to symbols
  • From: Bruce Colletti <vze269bv at verizon.net>
  • Date: Tue, 5 Jul 2005 04:52:26 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Andrzej

The aim is to explictly avoid (throughout the code) referring to the variables.  

For instance, suppose matrix T (in my code) springs from an Excel spreadsheet imported into Mathematica, one whose top row declares the variable names, and whose later rows give the variables' values for each iteration in a simulation.  Suppose further that the number of columns may change.

Bruce


Bruce

=====================
From: Andrzej Kozlowski <akozlowski at gmail.com>
To: mathgroup at smc.vnet.net
Subject: [mg58518] [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] Can't assign value to symbols

To tell the truth, I don't understand what you are trying to do. Why  
do you want to reevaluate the line X=... ?

If you do not want at the end of your Do loop the variables a,b,c to  
have assigned values the simplest way is to use Block:

Block[{a, b, c}, Do[
     Print@MapThread[Set, {ToExpression[X,
          StandardForm, Unevaluated], T[[k]]}],
     {k, 2, Length@T}]];

All the assignments will now take place locally inside Block and the  
variables {a,b,c} are automatically cleared on exit-ting Block.

Andrzej Kozlowski


On 5 Jul 2005, at 00:18, Bruce Colletti wrote:

> Andrzej
>
> Using your reply, I offer this code for Lee's consideration.
>
> Although it works when first run, if re-run without quitting the  
> kernal, the "X= line" causes an error because a,b,c are instantiated.
>
> At the start of the program, how can I clear these variables  
> WITHOUT explicitly declaring them?  I've failed to find the right  
> argument for Clear (e.g., Clear at Subscript...can't find the right  
> counterpart for Subscript).
>
> Thankx.
>
> Bruce
>
>
> T={{a,b,c},{3,4,2},{12,2,1},{6,5,-3}};
>
> X=Map[SymbolName,T[[1]]];
>
> Do[Apply[Clear,ToExpression[X,StandardForm,Unevaluated]];
>     Print@MapThread[Set,{ToExpression[X,StandardForm,Unevaluated],T 
> [[k]]}],
>     {k,2,Length@T}];
>
> =====================
> From: Andrzej Kozlowski <akozlowski at gmail.com>
To: mathgroup at smc.vnet.net
> Date: Sun Jul 03 02:57:11 CDT 2005
> Subject: [mg58518] [mg58513] [mg58458] Re: [mg58444] Re: [mg58409] Can't assign value  
> to symbols
>
> Instead of ToExpression use
>
> ToExpression[#, StandardForm, Unevaluated] &
>
> For example:
>
>
> In[1]:=
> parameters = {{"a", "b", "c"}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
>
> In[2]:=
> MapThread[(#1 = #2) & , {ToExpression[#,StandardForm,Unevaluated]& /@
> parameters[[1]],
> parameters[[3]]}] ;
>
> In[3]:=
> a
>
> Out[3]=
> 4
>
> In[4]:=
> MapThread[(#1 = #2) & , {ToExpression[#,StandardForm,Unevaluated]& /@
> parameters[[1]],
> parameters[[2]]}] ;
>
> In[5]:=
> a
>
> Out[5]=
> 1
>
>
> Of course instead of Standardform you can use TraditionalForm or even
> InputForm.
>
> Andrzej Kozlowski
>
> Chiba, Japan
>
>
> On 2 Jul 2005, at 17:07, Lee Newman wrote:
>
>
>> 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
>>>
>>>
>>>
>>>
>>
>>
>>
>>
>>
>
>


  • Prev by Date: Re: How to simulate random samples from crooked coin toss?
  • Next by Date: Re: display of function
  • Previous by thread: Re: Re: Re: Can't assign value to symbols
  • Next by thread: Re: Re: Re: Re: Can't assign value to symbols