In the course of making some RLink
wrappers I want to have some richer containers like Mathematica does with its FittedModel
code. I thought I had a good idea of how this might be done, i.e make a custom Format
specification that hides some arguments and use DownValues
to give different parts of the code.
In looking at actual FittedModel
objects this does not seem to be what is being done, as it has no DownValues
. Also when you look at the FullForm
it doesn't seem to have enough data to give back all the "Properties" available.
My question is, is their documentation for making rich data objects like Mathematica is commonly doing these days?
I do really want to understand how to use DownValues
/SubValues
to actually implement the type of behavior something like FittedModel
has. ... Is there a way to make it clear that this is not covered by the linked to question (which just deals with the Format/Boxes issue)?
Answer
After some work and clarification from Leonid it becomes clear this is a case where SubValues
is the exact solution. As this answer points out SubValues
are patterns of the form
food[d][f] := a;
which is the correct form for accessing parts of an "data-like" object since the sub value has access to the containing expression parts.
Now to build on a similar answer we have to small extension of instead of just using accessor functions, we can actually build SubValues
so that we can do this on the symbol itself like Mathematica data objects do. From the previous answer we have:
makeMyData[d1_, d2_] := MyData[d1, d2]
Format[MyData[d1_, d2_]] := "MyData[<" <> ToString[Length[d1] + Length[d2]] <> ">]"
Now we just add some SubValues
to MyData
MyData[d1_, d2_]["D1"] := d1
MyData[d1_, d2_]["D2"] := d2
MyData[d1_, d2_]["Properties"] := {"D1", "D2"}
and then we get the expected behavior as follows
dat = makeMyData[Range[1, 10], b]
dat["D1"] (* returns {1, ..., 10} *)
dat["D2"] (* returns b *)
dat["Properties"] (* returns {"D1", "D2"} *)
Comments
Post a Comment