[Date Index]
[Thread Index]
[Author Index]
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/
Prev by Date:
**Baffling Failure when plotting multiple curves.**
Next by Date:
**RE: LogLogListPlot, LogLinearListPlot- Ticks and TickMarks**
Previous by thread:
**Re: Why is this replacement not performed the first time?**
Next by thread:
**NDSolve does not work in shooting method**
| |