# Expressions¶

Expressions allow for defining predicates or computing new variables based on existing data. The expression language is based on JavaScript, but provides only a limited set of features, guaranteeing secure execution.

Expressions can be used with the `"filter"` and `"formula"` transforms, in encoding, and in expression references for dynamic properties in marks, transforms, and data sources.

## Usage¶

All basic arithmetic operators are supported:

``````(1 + 2) * 3 / 4
``````

When using expressions within the data transformation pipeline, the current data object is available in the `datum` variable. Its properties (fields) can be accessed by using the dot or bracket notation:

``````datum.foo + 2
``````

If the name of the property contains special characters such as "`.`", "`!`", or "` `" (a space) the bracket notation must be used:

``````datum['A very *special* name!'] > 100
``````

## Conditional operators¶

Ternary operator:

``````datum.foo < 5 ? 'small' : 'large'
``````

And an equivalent `if` construct:

``````if(datum.foo < 5, 'small', 'large')
``````

## Provided constants and functions¶

Common mathematical functions are supported:

``````(datum.u % 1e-8 > 5e-9 ? 1 : -1) *
(sqrt(-log(max(1e-9, datum.u))) - 0.618) *
1.618
``````

### Constants and functions from Vega¶

The following constants and functions are provided by the vega-expression package.

### Other functions¶

# lerp(array, fraction)
Provides a linearly interpolated value from the first to the last element in the given array based on the specified interpolation fraction, usually ranging from 0 to 1. For instance, lerp([0, 50], 0.5) yields 25.

# linearstep(edge0, edge1, x)
Calculates a linear interpolation between 0 and 1 for a value x within the range defined by edge0 and edge1. It applies a clamp to ensure the result stays within the 0.0 to 1.0 range.

# smoothstep(edge0, edge1, x)
Performs smooth Hermite interpolation between 0 and 1 for values of x that lie between edge0 and edge1. This function is particularly useful for scenarios requiring a threshold function with a smooth transition, offering a gradual rather than an abrupt change between states.