Re: Function to detect presence of a variable in

• To: mathgroup at smc.vnet.net
• Subject: [mg109397] Re: Function to detect presence of a variable in
• From: Leonid Shifrin <lshifr at gmail.com>
• Date: Sun, 25 Apr 2010 06:24:10 -0400 (EDT)

```Hi Carlos,

Here is one possibility:

ClearAll[countMeIn];
SetAttributes[countMeIn, HoldFirst];
countMeIn[expr_, var_Symbol] :=
Count[Unevaluated[expr], var, Infinity];
countMeIn[expr_, vars : {__Symbol}] :=
Map[countMeIn[expr, #] &, vars];

Seems to work as you wanted:

In[27]:= countMeIn[(2/x)^(x*w^4*z), {x, y, w, z}]

Out[27]= {2, 0, 1, 1}

In[28]:= countMeIn[(1/x)^x, x]

Out[28]= 2

One complication which forced me to make it HoldFirst and
use Unevaluated is that expressions that you enter sometimes auto-evaluate
to something else. For example, entering (2/x)^(x*w^4*z) will result in

In[17]:= (2/x)^(x*w^4*z)

Out[17]= 2^(w^4 x z) (1/x)^(w^4 x z)

which has different counts for the variables but is otherwise equivalent to
the original expression. With HoldFirst, the function will analyze your
original expression.

Hope this helps.

Regards,
Leonid

On Sat, Apr 24, 2010 at 1:01 AM, <carlos at colorado.edu> wrote:

> I would like to have a function
>
>            k = CountMeIn[expr,var]
>
> that returns the number of times var appears in expr, eg.
> CountMeIn[(1/x)^x,x]  returns 2. var could be a list, in which case
> k would be a conforming list: k = CountMeIn[(2/x)^(x*w^4*z),{x,y,w,z}]
> should return {2,0,1,1}.  expr is never a list.
>
> Tried to use Position for this, but the behavior is finicky:
> Position[1/x,x] returns {{1,1}} but Position[x,x] or Position[1*x,x]
> returns {{}}  (why?)  May be expr should be converted  to {expr}
> inside the function for safety?
>
>

```

• Prev by Date: Re: Stop mathematica reordering expression during matrix
• Next by Date: Re: problems with NMinimize
• Previous by thread: Re: Function to detect presence of a variable in
• Next by thread: Re: Function to detect presence of a variable in