Re: Why is this replacement not performed the first time?
- To: mathgroup at smc.vnet.net
- Subject: [mg44140] Re: [mg44128] Why is this replacement not performed the first time?
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Fri, 24 Oct 2003 04:24:09 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
On Thursday, October 23, 2003, at 08:16 PM, Steven T. Hatton wrote: > When I evaluate the following expression, I get the error shown > subsequently: > Table[locations[[i1]][[j1]][[k1]]/. > Flatten[Table[{i1 -> i + i2, j1 -> j + j2, k1 -> k + k2}, {i2, -1, > 1, > 2}, {j2, -1, 1, 2}, {k2, -1, 1, 2}], 2] > , {i, 2, 4}, {j, 2, 4}, {k, 2, 4}] > > \!\(\* > RowBox[{\(Part::"pspec"\), \(\(:\)\(\ \)\), "\<\"Part specification \ > \\!\\(i1\\) is neither an integer nor a list of integers. \\!\\( > \*ButtonBox[\ > \\\"More\[Ellipsis]\\\", ButtonStyle->\\\"RefGuideLinkText\\\", \ > ButtonFrame->None, ButtonData:>\\\"General::pspec\\\"]\\)\"\>"}]\) > > After the error, I get the table I expect from the statement. Why am I > getting this error? Is it because Mathematica is doing some kind of > syntax > checking before executing? > -- > "Philosophy is written in this grand book, The Universe. ... But the > book > cannot be understood unless one first learns to comprehend the > language... > in which it is written. It is written in the language of mathematics, > ...; > without which wanders about in a dark labyrinth." The Lion of Gaul > > > No, it's just a matter of evaluation order. Let me illustrate this on a simpler. But first of all let me point out that you need not use the unwieldy form > locations[[i1]][[j1]][[k1]] since locations[[i1,j1,k1]] will do the same and has some additional advantages. To illustrate your problem consider first the simple example: f = {1, 2, 3}; Table[f[[i]] /. i -> j, {j, 1, 2}] From In[3]:= Part::pspec: Part specification i is neither an integer nor a list of integers. More? From In[3]:= {1, 2} What happened is simply this. The first argument of Table is ReplaceAll[f[[i]],i->j]. When this is evaluated within Table, since ReplaceAll does not hold its first argument it tried to evaluate it, which of course it can't do since i has no value at this point. So you get the error message. But since the result of the unsuccessful evaluation of f[[i]] is just f[[i]], that is what ReplaceAll receives and it can then proceed with the replacement. So in the end you end up with the right answer. A simple way to deal with this problem is to wrap Unevaluated around f[[i]]: In[5]:= Table[Unevaluated[f[[i]]] /. i -> j, {j, 1, 2}] From In[5]:= {1, 2} But let's now complicate things further, to make them more like your case. Instead of a single replacement rule let7s have a list of replacement rules. Now wrapping Unevaluated no longer works: In[7]:= Table[Unevaluated[f[[i]]] /. {{i -> j}, {i -> j + 1}}, {j, 1, 2}] From In[7]:= Part::pspec: Part specification i is neither an integer nor a list of integers. More? From In[7]:= General::stop: Further output of Part::pspec will be suppressed during this calculation. More? From In[7]:= {{1, 2}, {2, 3}} The reason is again the evaluation order. Rather than try to describe it let me present one solution that should be self-explanatory: Table[(Unevaluated[f[[i]]] /. #1 & ) /@ {{i -> j}, {i -> j + 1}}, {j, 1, 2}] {{1, 2}, {2, 3}} So if you want to avoid your error message you will have to do something like this. But actually, since the message is quite harmless in this case you may simply just turn it off with using the function Off[symbol::tag]. Andrzej Kozlowski Yokohama, Japan http://www.mimuw.edu.pl/~akoz/