##
**First, Apply, Sequence, ReplaceAll**

There come times in every

*Mathematica*user's life when the all-pervasive List brackets get in the way. Sometimes it's easy to redesign the function to accept the arguments in a List. Here are other solutions.

## First

For a*single*element enclosed by brackets, you can use First to extract the element. In this example, since all

*Mathematica*arithmetic functions are Listable (they will automatically Map over a List) we specify that the argument must be an Integer so the function will fail.

**enclosed1={2};**

**Clear@function1;function1@x_Integer:=x^3;**

**function1@enclosed1**

**function1[{2}]**

**function1@First@enclosed1**

**8**

##
**Apply**

First, see if you can use Apply @@ to apply a function to the contents of your List. Apply will replace the List head with your desired function and Evaluate it.**In[107]:= Range@15**

Out[107]= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

**In[108]:= Plus@@%**

Out[108]= 120

Here's a single filename that is unnecessarily surrounded by List brackets. It's a String, so we just Apply ToString to it. It then stands alone – no List brackets – but its Head is String.

**FileNames[]**

{TableFiredFibers-Control-CathodeOnly-0p644.txt}

**ToString@@%141**

TableFiredFibers-Control-CathodeOnly-0p644.txt

**Head@%**

String

**FullForm@%%**

"TableFiredFibers-Control-CathodeOnly-0p644.txt"

##
**Sequence**

Mathematica was designed as a list processing language in which the list is the fundamental data structure. Allan Newell's IPL (Information Processing Language) was the original prototype, after which John McCarthy coupled the list as a universal data structure with the lambda calculus and logic functions into the major programming language, LISP.We can Apply Sequence to a List to replace List as the container (the Head). Here are two examples, first to a single List, then to a List of Lists.

**In[115]:= Sequence@@{0,4}**

Out[115]= Sequence[0,4]

**In[119]:= Sequence@@{{0,1,1},{0,2},{0,1,3},{0,4}}**

Out[119]= Sequence[{0,1,1},{0,2},{0,1,3},{0,4}]

FileNameJoin is the safe way to assemble filepaths in Mathematica since it knows your operating system syntax. However FileNameJoin only accepts a single-level List as its argument. To feed it a nested List, use Sequence instead of List as the Head of the inner List.

**In[350]:= twoPathElements={"webPages","index.html"};**

**In[351]:= FileNameJoin@{$HomeDirectory,twoPathElements}**

Out[351]= FileNameJoin[{C:\Users\kwcarlso,{webPages,index.html}}]

Since it didn't see a List of Strings (filepath names) as the correct argument types, FileNameJoin returned the input. Using Sequence solves this.

**In[352]:= twoPathElements=Sequence["webPages","index.html"];**

**In[353]:= FileNameJoin@{$HomeDirectory,twoPathElements}**

Out[353]= C:\Users\kwcarlso\webPages\index.html

The context of one function I use to illustrate Sequence is worth mentioning (but skip this to get to more usages of Sequence). I have digitally sampled a curve from the literature (a paper by Holsheimer from 1999) in the graphing program Origin. In other words, you can import an image, in this case a graph for which Holsheimer doesn't give either the underlying data or an equation, and repeatedly click on it to harvest {x,y} values. We captured 163 sample points on the solid curve below, which is a vast improvement on the antiquated method of using a straightedge to pick up x and y values off the axes.

With that many sample points, finding the x value closest to the one desired is a reasonable alternative to fitting a curve and applying the fit equation to values you wish to interpolate or extrapolate.

So this is a function to find the nearest x value (a neuron axon diameter, fiberDiameter) to one for which we want to know the threshold as determined by Holsheimer (which is the y-value retrieved). The problem is Nearest returns values in List brackets, which don't match the un-bracketed x values in the List of data. Applying Sequence to the result of Nearest feeds the unbracketed value to Cases, which then performs the match.

Clear@diameterThreshold; diameterThreshold[fiberDiameter_, fiberThresholdSourceData_:holsheimerData1999] := Cases[fiberThresholdSourceData, {x_, y_} /; x == Sequence@@Nearest[fiberThresholdSourceData[[All, 1]], fiberDiameter] ]

So in sum this function says: Clear the function name (which I do habitually at the start of a function definition to prevent accidentally testing a previous version as I revise it). Then define it as the Cases in the source data file (fiberThresholdSourceData--default to the holsheimerData1999 file unless I specify another file) such that ( /; ) the x-value is Nearest to the fiberDiameter parameter I give it.

##
**ReplaceAll**

Here is a third way using rule patterns.**In[128]:= {{0,1,1},{0,2},{0,1,3},{0,4}}/. List[a__] ->a**

Out[128]= Sequence[{0,1,1},{0,2},{0,1,3},{0,4}]

## No comments:

## Post a Comment