Clear complains that a subscripted variable is not a symbol or a string?



Here's a small listing where I've used EscqEsc to typeset θ in the notebook:

Clear[ f, θ, Subscript[x, r] ]
Subscript[x, r] := 3
f[θ_] := Subscript[x, r] Cos[θ]

Plot[f[θ], {θ, 0, Pi}]

(in my notebook this looked like $x_r$, not Subscript[x, r] for example).

This produces a message from Clear of the form:

Clear::ssym : x_r is not a symbol or a string

What is curious is that I appear to be able to assign to this variable $x_r$ without any trouble, yet it is apparently treated differently than my other symbols f and θ.

How exactly does Mathematica define a symbol. Why can I use $x_r$ like a variable, yet it does not have this symbol characterization?

Peeter Joot

Posted 2012-01-20T16:01:02.367

Reputation: 6 098

If you are unfamiliar with DownValue, OwnValue and so on it is worth reading this post in addition to the answers below.

– Mike Honeychurch – 2012-01-20T23:22:34.670

Related: (1004)

– Mr.Wizard – 2013-09-05T09:27:41.657



Your code reveals exactly why Clear complains: Subscript[x, r] is not a Symbol nor a String. When you assign a value to it, you're setting a DownValue not an OwnValue; in other words, you're setting the value of a function not a variable. To use $x_r$ as a symbol, use the Notation` package's function, Symbolize. I'd recommend using it from the palette directly, as it has all of the intricacies already set up for you.


Posted 2012-01-20T16:01:02.367

Reputation: 32 561

6...and you can use ClearNotations to clear your Symbolized symbols. – Mike Honeychurch – 2012-02-23T23:28:03.100

3rcollyer wrote: "Subscript[x, r] is not a Symbol nor a String" ........... That rather evades the point. Why should Clear be artificially restricted to operate on Symbols or Strings? I cannot think of any reason why Clear[$x_1$] should not be able to work. In my view, this is a blatant user-interface failing of Mma, and one that has been unnecessarily unresolved for over 20 years. – wolfies – 2013-09-05T14:04:11.453

2@wolfies I find that you frustrate me. It is apparent that you either did not read the rest of the text I wrote or deliberately ignored it so that you could express your frustration. Unset works, but it is unclear what Clear would operate on, Subscript, x, 1? What about the case where both arguments to Subscript are symbols, what should happen then? Without Notation`, Subset[x,1] is not atomic! So, if you have a better way, submit an answer. – rcollyer – 2013-09-05T14:40:11.123

1As you are perfectly aware, Unset[$x_1$] works ... in fact, it is required, since Clear fails to provide a uniform clearing interface. And since Unset does the job, there is plainly no inherent reason that Clear cannot be made to operate in the same manner. Clear doesn't have to be atomic. That is the point. As for your 'frustrations' ... ? – wolfies – 2013-09-06T19:53:22.860


As the error message indicates Clear does not work that way. There are several assignment forms that automatically create a definition to something other than a raw symbol:

x[5] = 1;
Subscript[x, 1] = 2;
x /: Subscript[x, 2] = 3;
N[x] = 3.14159;

{HoldPattern[x[5]] :> 1}

{HoldPattern[Subscript[x, 1]] :> 2}

{HoldPattern[Subscript[x, 2]] :> 3}

{HoldPattern[N[x, {MachinePrecision, MachinePrecision}]] :> 3.14159}

(See documentation for: DownValues, UpValues. NValues is not directly documented.)

You cannot clear any of these forms in the fashion you attempted:

(* Failure

Clear[ x[5] ]
Clear[ Subscript[x, 1] ]
Clear[ Subscript[x, 2] ]
Clear[ N[x] ]


You can clear some of them with Unset (short form =.):

x[5] =.
Subscript[x, 1] =.
N[x]  =.

Unset[Subscript[x, 2]] does not work because it was created with TagSet (/:), and for that you need TagUnset:

x /: Subscript[x, 2] =.


Posted 2012-01-20T16:01:02.367

Reputation: 259 163

What is NValues? I haven't seen it elsewhere. – Ion Sme – 2021-02-02T06:02:09.297

1I thought about mentioning Unset, but didn't. So, you get the +1. – rcollyer – 2012-01-20T16:38:44.237


You get that error because Mathematica does not recognize $x_r$ as a symbol. To instruct it to treat symbols with subscripts also as symbols, you'll need to use the Notations` package like so:

<< Notation`
Symbolize[ParsedBoxWrapper[SubscriptBox["_", "_"]]]

Now you should have no problems in clearing your subscripted symbol.

rm -rf

Posted 2012-01-20T16:01:02.367

Reputation: 85 395


That is because the value is set to a DownValue of Subscript..



Posted 2012-01-20T16:01:02.367



If you want to clear all subscript variables, similarly to Clear["Global'*"] (the ' should be a backtick) I have always used the following with good results:


Which seems to clear all variables of the form:


Jesse Hulbert

Posted 2012-01-20T16:01:02.367

Reputation: 51

It's a nice idea, but it only works with definitions that are attached to the Symbol Subscript. See my answer for examples of other definitions. – Mr.Wizard – 2014-01-13T08:41:59.667