Inital version of loom in R6
authorPaul Hoffman <phoffman@nygenome.org>
Fri, 27 Oct 2017 20:07:43 +0000 (16:07 -0400)
committerPaul Hoffman <phoffman@nygenome.org>
Fri, 27 Oct 2017 20:07:43 +0000 (16:07 -0400)
NAMESPACE
R/loom.R
man/loom-class.Rd

index 2a2c47da2aa3fe173843abf501f395fa08a4cc07..a393e15531d49713a39cef4ccd29e968437f5549 100644 (file)
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,10 +1,6 @@
 # Generated by roxygen2: do not edit by hand
 
 export(connect)
-exportClasses(loom)
-import(h5)
-importFrom(methods,callNextMethod)
-importFrom(methods,setClass)
-importFrom(methods,setGeneric)
-importFrom(methods,setMethod)
-importFrom(utils,packageVersion)
+export(loom)
+import(hdf5r)
+importFrom(R6,R6Class)
index edae5a7ad24686bec57f92ef741a45485e0dbb72..bd380b211b8f1c5cec4f23ffdc84613abedbd214 100644 (file)
--- a/R/loom.R
+++ b/R/loom.R
@@ -1,46 +1,64 @@
-#' @import h5
-#' @importFrom methods setClass setMethod setGeneric callNextMethod
+#' @import hdf5r
+#' @importFrom R6 R6Class
 NULL
 
 #' A class for loom
 #'
-#' @slot shape The shape of /matrix
-#' @slot version The version of loomR that this object was made under
-#'
+#' @docType class
 #' @name loom-class
 #' @rdname loom-class
-#' @exportClass loom
+#' @return Object of class \code{\link{loom}}
+#' @seealso \code{\link{hdf5r::H5File}}
 #'
-loom <- setClass(
-  Class = 'loom',
-  #i'm not sure what we should store as slots, and what we should store as attributes or groups
-  slots = c(
-    # filename = 'ANY', # Already provided through H5File@location
-    shape = 'vector',
-    version = 'ANY'
-  ),
-  contains = 'H5File'
-)
-
-#' @importFrom utils packageVersion
+#' @export
 #'
-setMethod(
-  f = 'initialize',
-  signature = 'loom',
-  definition = function(.Object, name, mode = 'a') {
-    .Object <- callNextMethod(
-      .Object,
-      name = name,
-      mode = mode
-    )
-    validateLoom(object = .Object)
-    #.Object@version <- packageVersion(pkg = 'loom')
-    # .Object@filename <- name
-    .Object@shape <- dim(.Object['/matrix'])
-    return(.Object)
-  }
+loom <- R6Class(
+  classname = 'loom',
+  inherit = hdf5r::H5File,
+  cloneable = FALSE,
+  portable = TRUE,
+  lock_class = TRUE,
+  public = list(
+    # Fields
+    version = NULL,
+    # Methods
+    initialize = function(
+      filename = NULL,
+      mode = c('a', 'r', 'r+'),
+      ...
+    ) {
+      do.validate <- file.exists(filename)
+      super$initialize(filename = filename, mode = mode, ...)
+      # if (do.validate) {
+      #   validateLoom(object = self)
+      # } else {
+      #   # self$version <- packageVersion(pkg = 'loom')
+      #   print()
+      # }
+    }
+  )
 )
 
+# #' @importFrom utils packageVersion
+# #'
+# setMethod(
+#   f = 'initialize',
+#   signature = 'loom',
+#   definition = function(.Object, name, mode = 'a') {
+#     .Object <- callNextMethod(
+#       .Object,
+#       name = name,
+#       mode = mode
+#     )
+#     validateLoom(object = .Object)
+#     #.Object@version <- packageVersion(pkg = 'loom')
+#     # .Object@filename <- name
+#     .Object@shape <- dim(.Object['/matrix'])
+#     return(.Object)
+#   }
+# )
+
+
 #' Validate a loom object
 #'
 #' @param object A loom object
@@ -50,18 +68,18 @@ setMethod(
 validateLoom <- function(object) {
   # A loom file is a specific HDF5
   # We need a dataset in /matrix that's a two-dimensional dense matrix
-  root.datasets <- list.datasets(.Object = object, path = '/', recursive = FALSE)
+  root.datasets <- list.datasets(object = object, path = '/', recursive = FALSE)
   if (length(x = root.datasets) != 1) {
     stop("There can only be one dataset at the root of the loom file")
   }
-  if (root.datasets != '/matrix') {
+  if (root.datasets != 'matrix') {
     stop("The root dataset must be called '/matrix'")
   }
   # There must be groups called '/col_attrs', '/row_attrs', and '/layers'
-  required.groups <- c('/row_attrs', '/col_attrs', '/layers')
-  dim.matrix <- object[root.datasets]@dim # Rows x Columns
-  names(dim.matrix) <- required.groups[1:2]
-  root.groups <- list.groups(.Object = object, path = '/', recursive = FALSE)
+  required.groups <- c('row_attrs', 'col_attrs', 'layers')
+  dim.matrix <- object[[root.datasets]]$dims # Rows x Columns
+  names(dim.matrix) <- required.groups[c(2, 1)]
+  root.groups <- list.groups(object = object, path = '/', recursive = FALSE)
   group.msg <- paste0(
     "There can only be three groups in the loom file: '",
     paste(required.groups, collapse = "', '"),
@@ -76,21 +94,21 @@ validateLoom <- function(object) {
   unlist(x = sapply(
     X = required.groups[1:2],
     FUN = function(group) {
-      if (length(x = list.groups(.Object = object[group], recursive = FALSE)) > 0) {
+      if (length(x = list.groups(object = object[[group]], recursive = FALSE)) > 0) {
         stop(paste("Group", group, "cannot have subgroups"))
       }
-      if (length(x = list.attributes(.Object = object[group])) > 0) {
+      if (length(x = list.attributes(object = object[[group]])) > 0) {
         stop(paste("Group", group, "cannot have subattributes"))
       }
-      for (dataset in list.datasets(.Object = object[group])) {
-        if (object[dataset]@dim != dim.matrix[group]) {
+      for (dataset in list.datasets(object = object[[group]])) {
+        if (object[[paste(group, dataset, sep = '/')]]$dims != dim.matrix[group]) {
           stop(paste("All datasets in group", group, "must be of length", required.groups[group]))
         }
       }
     }
   ))
-  for (dataset in list.datasets(.Object = object['/layers'])) {
-    if (any(object[dataset]@dim != dim.matrix)) {
+  for (dataset in list.datasets(object = object[['/layers']])) {
+    if (any(object[[paste('layers', dataset, sep = '/')]]$dims != dim.matrix)) {
       stop(paste("All datasets in '/layers' must be", dim.matrix[1], 'by', dim.matrix[2]))
     }
   }
index 4b63d8d7edbcfc53debe3a9956b4c4de3bc21b07..be46017ea57cfa73c7dc28b35c2e0c6b968fe4d4 100644 (file)
@@ -5,14 +5,17 @@
 \alias{loom-class}
 \alias{loom}
 \title{A class for loom}
+\format{An object of class \code{R6ClassGenerator} of length 24.}
+\usage{
+loom
+}
+\value{
+Object of class \code{\link{loom}}
+}
 \description{
 A class for loom
 }
-\section{Slots}{
-
-\describe{
-\item{\code{shape}}{The shape of /matrix}
-
-\item{\code{version}}{The version of loomR that this object was made under}
-}}
-
+\seealso{
+\code{\link{hdf5r::H5File}}
+}
+\keyword{datasets}