Re: Can't assign value to symbols

*To*: mathgroup at smc.vnet.net*Subject*: [mg58585] Re: [mg58528] Can't assign value to symbols*From*: Bruce Colletti <vze269bv at verizon.net>*Date*: Fri, 8 Jul 2005 00:46:18 -0400 (EDT)*Sender*: owner-wri-mathgroup at wolfram.com

Andrzej Your reply has led me to the following code, which improves an earlier posting. Your idea to use strings led to doing so for T-row #1. Other than T[[1]] not being the symbols list {a,b,c}, do you see a problem with the code below? Bruce a = b = c = 2; T = {{"a", "b", "c"}, {3, 4, 2}, {12, 2, 1}, {6, 5, -3}}; Scan[Clear, T[[1]]]; Do[MapThread[Set, {Y = ToExpression@T[[1]], T[[k]]}]; Print[a + b + c, " ", Total@Y]; Scan[Clear, T[[1]]], {k, 2, Length@T}]; ===================== From: Andrzej Kozlowski <akozlowski at gmail.com> To: mathgroup at smc.vnet.net Subject: [mg58585] [mg58528] Re: [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] Can't assign value to symbols Bruce The only way I can imagine of dealing with this situation is if you first make sure that the data that are originally imported into Mathematica are imported as a string and not an expression. (This is easy to do with external data with Mathematica functions ReadList or Import ). So, for example, if to start with T has the form T = "{{a,b,c},{3,4,2},{12,2,1},{6,5,-3}}"; Then all you need to do is: Scan[Clear, StringCases[T, LetterCharacter]] and all the prior values of a, b, and c will b cleared. You can then convert T to Expression with ToExpression. Andrzej On 5 Jul 2005, at 23:35, Bruce Colletti wrote: > Andrzej > > Yes, your idea does work! Thanks. > > I've moved your Scan to the inside-end of the loop, since it kills > two birds with one stone. The code below works as intended unless > a,b,c have values (and then error messages abound). > > The only way I know to avoid this problem is to make Scan > [Clear,Names["Global`*"]] the new first line...except that this > (unfortunately) zaps ALL variables. > > There must be a better way (than my above idea) to clear the T[[1]]- > variables (that may have values coming into the code below). > > How would you tell Mathematica to hold unevaluated the T[[1]]- > elements so that they can be used to clear the associated variables? > > Bruce > > T={{a,b,c},{3,4,2},{12,2,1},{6,5,-3}}; > X=Map[SymbolName,T[[1]]]; > > Do[Print@MapThread[Set,{ToExpression[X,StandardForm,Unevaluated],T > [[k]]}]; > Scan[Clear,X], > {k,2,Length@T}]; > > > ===================== > From: Andrzej Kozlowski <akozlowski at gmail.com> To: mathgroup at smc.vnet.net > Date: Tue Jul 05 04:38:50 CDT 2005 > To: Bruce Colletti <vze269bv at verizon.net> > Subject: [mg58585] [mg58528] Re: [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] > Can't assign value to symbols > > I see. In this case, does not > > Scan[Clear,X] > > after the Do loop do what you want? > > Andrzej > > On 5 Jul 2005, at 17:31, Bruce Colletti wrote: > > > > >> 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 >> Date: Tue Jul 05 00:57:52 CDT 2005 >> Subject: [mg58585] [mg58528] [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: [mg58585] [mg58528] [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 >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>> >>> >>> >> >> >> >> >> > > > >