# Define column types in a Dataset - Failure on append and Typesystem

I have a basic function that populates a Dataset according to user specified parameters.

PopulateMap[eMapId_, eModule_, volBounds_, xInit_, yInit_, zInit_, \[CapitalDelta]x_, \[CapitalDelta]y_, \[CapitalDelta]z_] :=
Module[{eMap, segmentCount, segmentIndex, xPos, yPos, zPos},

Remove[eMap];

eMap = Dataset[{<|"MapId"->eMapId,
"ModuleId"->0,
"SegmentId"->0,
"x1"->0, "y1"->0, "z1"->0,
"x2"->0, "y2"->0, "z2"->0,
"Polarity"->0,
"ChargeDensity"->0|>}];

segmentCount = Length[eModule];

(* If passed eModule contains no segments *)
If[ segmentCount == 0,
Return[eMap]];

xPos = xInit;
yPos = yInit;
zPos = zInit;

While[ xPos < volBounds[1]["x2"],

(* Add segments around {xPos, yPos, zPos} *)
For[i=1, i<=segmentCount, i++,

AppendTo[ eMap, <|"MapId"->eMapId,
"ModuleId"-> eModule[i]["ModuleId"],
"SegmentId"->eModule[i]["SegmentId"],
"x1"->(xPos+eModule[i]["x1"]),
"y1"->(yPos+eModule[i]["y1"]),
"z1"->(zPos+eModule[i]["z1"]),
"x2"->(xPos+eModule[i]["x2"]),
"y2"->(yPos+eModule[i]["y2"]),
"z2"->(zPos+eModule[i]["z2"]),
"Polarity"->eModule[i]["Polarity"],
"ChargeDensity"->0|>]
];

xPos += \[CapitalDelta]x;
yPos += \[CapitalDelta]y;
zPos += \[CapitalDelta]z;

];

Return[eMap];
]


If I call PopulateMap with an integer for xInit (for example: -197):

eMap = PopulateMap[1, electrodeModule02, volumeBounds, -197, 0, 0, 20, 0, 0]


The Dataset is populated without problem.

If I set xInit to -197.5:

eMap = PopulateMap[1, electrodeModule02, volumeBounds, -197.5, 0, 0, 20, 0, 0]


The following error occurs:

Failure[Append, <|"MessageTemplate" :> Dataset::invalid,
"MessageParameters" -> <|"Head" -> Append,
"Arguments" -> {TypeSystemVector[
TypeSystemAssoc[TypeSystemAtom[String],
TypeSystemAtom[Integer], 11], 1]


Taking a queue from SQL-type languages I have used in the past, I made the following change to the first call to Dataset (changed the initial values for x1, y1, z1, x2, y2, z2 from 0 to 0.0:

          eMap = Dataset[{<|"MapId"->eMapId,
"ModuleId"->0,
"SegmentId"->0,
"x1"->0.0, "y1"->0.0, "z1"->0.0,
"x2"->0.0, "y2"->0.0, "z2"->0.0,
"Polarity"->0,
"ChargeDensity"->0|>}];


After this change, the Dataset is generated without error.

Is there a way to formally define the columns and column types in a Dataset? For example, if I wanted to store table definitions in an external file or database and instantiate the Datasets from the external definitions?

• There seems to be a problem in appending data to a dataset, workaround are on some articles here. Problem is described in mathematica.stackexchange.com/questions/68979/… – mgamer Jan 18 '15 at 18:46
• Could you please make this a self-contained example by defining all of the symbols used (e.g. electrodeModule02 and volumeBounds). The type system uses heuristics heavily and its behaviour is very sensitive to the exact data. Also, please mention which version you are using -- the heuristics have changed radically between 10.0.0, 10.0.1 and 10.0.2. – WReach Jan 18 '15 at 18:56
• See Dataset with no members for ways to create an empty yet typed dataset. – WReach Jan 18 '15 at 19:31