# FlexTable

This package defines a second tabular container type, FlexTable, that is designed to be a more flexible table.

The two primary difference between Table and FlexTable are that

• The columns can be mutated - that is, we can add, replace or delete a column.
• The compiler cannot track the types or names of the columns.

Thus, a FlexTable provides the same interface as a Table plus some extra operations. However, the fact that the compiler can no longer statically analyse the names and types of the columns at any given moment of the program means that the element type of a FlexTable is no more specific than NamedTuple. Iteration over rows will therefore be slower using for loops than for the equivalent Table - for maximum speed, higher-level functions (like map, filter, reduce, group and innerjoin) or a high-level DSL (like Query.jl) should be utilized.

Amongst other things, using FlexTable might allow you to more easily port your code from another environment where the columns are mutable, such as DataFrames.jl.

A column can be added by using the . operator (also known as setproperty!).

julia> ft = FlexTable(name = ["Alice", "Bob", "Charlie"], age = [25, 42, 37])
FlexTable with 2 columns and 3 rows:
name     age
┌─────────────
1 │ Alice    25
2 │ Bob      42
3 │ Charlie  37

julia> ft.sex = [:F, :M, :M];

julia> ft
FlexTable with 3 columns and 3 rows:
name     age  sex
┌──────────────────
1 │ Alice    25   F
2 │ Bob      42   M
3 │ Charlie  37   M

The same syntax is used to replace a column.

julia> ft.sex = ["female", "male", "male"];

julia> ft
FlexTable with 3 columns and 3 rows:
name     age  sex
┌─────────────────────
1 │ Alice    25   female
2 │ Bob      42   male
3 │ Charlie  37   male