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" -> {TypeSystem`Vector[
TypeSystem`Assoc[TypeSystem`Atom[String],
TypeSystem`Atom[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?
electrodeModule02
andvolumeBounds
). 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. $\endgroup$