# Error when using rule as a list index - { i, x[[i]] } /. i -> 5

I can't seem to use a rule to index a vector.

x = Range;
{ i, x[[i]] } /. i -> 5


I get the following error when evaluating the above code, even if the next cell shows the correct result:

Part::pspec: Part specification i is neither an integer nor a list of integers.


Using Trace,

Trace[x = Range; { i, x[[i]] } /. i -> 5]


we will see that the error comes from Mathematica trying to evaluate

{1,2,3,4,5,6,7,8,9,10}[[i]]


As you pointed out, the error message is harmless in this case. If you want Mathematica to substitute first, you can use Hold and ReleaseHold:

x = Range;
ReleaseHold[Hold[{i, x[[i]]}] /. i -> 5]


which prevents the evaluation of {i, x[[i]]} until the Hold is released. The output is the same, but now without the error message:

{5,5}

The existing answers explain why you are getting this error and how to get around it, and along the way explain something very useful about how evaluation works in Mathematica.

I would like to suggest some alternatives to get the output you want. Assume x=Range as in your question.

Firstly, you could try setting i to be a local constant using With:

With[{i = 5}, {i, x[[i]]}]


{5, 5}

Secondly, you could try using a pure function:

{#, x[[#]]} &@ 5


{5, 5}

Whether you would prefer to use one of these alternative methods depends on the nature of the larger problem you are working on.

Since this gives the correct answer in spite of the message, you could just use Quiet:

x = Range;
Quiet[{i, x[[i]]} /. i -> 5]

 {5, 5}


As stated several times this is the result of Mathematica evaluating x[[i]], just as the error message told you. Also, you can click the >> at the end of the message to get some more information.

You can do this operation in a number of ways, one of the best being With as Verbeia shows.
With only allows you to replace symbols however. If you need to match patterns I suggest that you use Unevaluated:

x = Range[7, 11];

Unevaluated[ {3 + 3, x[]} ] /. _Integer -> 5

{10, 11}


Here both 3 and 1 were replaced with 5 because they match the pattern _Integer and this was done before evaluation (or you would get {6, 7}).