When reading from an hdf5 file I would like to automatically call a function I define when datasets of an arbitrary type (see: 'class') are read from an hdf5 file. Since it looks like the existing infrastructure (courtesy of the 'callGeneric' parameter in h5read) in rhdf5 was made for this, I would like to avoid duplicating work. But I can't find an example of the h5read.<classname> functionality indicated in the callGeneric description in the h5read man page.

A simple example is if the type is integer, I want as.integer to be automatically called on the read-in object before it gets passed back. But I intend to extend this to other Bioconductor classes of arbitrary complexity.

Based on the documentation, it seems like either using attr(foo "class") <- "integer" (in conjunction with h5write(<...>, write.attributes=TRUE) or adding a 'class' attribute through the h5writeAttribute interface should be enough to trigger the h5read.integer function upon calling h5read. Neither seems to work. Note that I can pass read.attributes=TRUE and the attributes get assigned the object (for example, the object comes back with a "class" attribute), but that's not exactly what I'm after.

In looking at the R/h5read.R source code, it looks like the block where the h5read.<classname> call gets set up (around line 59) queries the "class" attribute of the read-in obj before the h5 object's attributes are actually read, so the 'cl' variable never seems to get set.

Here's an example where I would expect h5read.<classname> to be invoked, but it doesn't:

library(rhdf5)
h5read.integer <- function(obj) { as.integer(obj) } ## h5read.<classname>
debug(h5read.integer)
exists(paste("h5read","integer",sep="."),mode="function")

h5fl <- tempfile(fileext=".h5")
h5createFile(h5fl)
ints <- 42L:33L
attr(ints, "class") <- "integer"
h5write(ints, h5fl, "foo", write.attributes=TRUE)
H5close()

## h5writeAttribute route
##fid <- H5Fopen(h5fl)
##did <- H5Dopen(fid, "foo")
##h5writeAttribute("integer", did, name="class")
##H5close()

##res <- h5read(h5fl, "foo", read.attributes=FALSE)
res <- h5read(h5fl, "foo", read.attributes=TRUE)

Running the external h5dump utility confirms that a "class" attribute is attached to the foo DATASET, which seems to match what the h5read man page prescribes. If I edit the source code to set the 'cl' variable to "integer" my h5read.integer function gets invoked, as expected.

Any help would be much appreciated. Thank you.

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to