Update documentation, flesh out validateLoom
authorPaul Hoffman <phoffman@nygenome.org>
Thu, 26 Oct 2017 19:27:04 +0000 (15:27 -0400)
committerPaul Hoffman <phoffman@nygenome.org>
Thu, 26 Oct 2017 19:27:04 +0000 (15:27 -0400)
R/loom.R
man/loom-class.Rd
man/validateLoom.Rd [new file with mode: 0644]

index 9129c8898e0511cd7ade5a77a8118be203e90c0f..c66f118b50723c574b1438b2a4d494da3f71ff3c 100644 (file)
--- a/R/loom.R
+++ b/R/loom.R
@@ -4,6 +4,9 @@ NULL
 
 #' A class for loom
 #'
+#' @slot shape The shape of /matrix
+#' @slot version The version of loomR that this object was made under
+#'
 #' @name loom-class
 #' @rdname loom-class
 #' @exportClass loom
@@ -12,9 +15,9 @@ 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(
-    version = 'ANY',
-    filename = 'ANY',
-    shape = "vector"
+    # filename = 'ANY', # Already provided through H5File@location
+    shape = 'vector',
+    version = 'ANY'
   ),
   contains = 'H5File'
 )
@@ -30,7 +33,10 @@ setMethod(
       name = name,
       mode = mode
     )
+    validateLoom(object = .Object)
     #.Object@version <- packageVersion(pkg = 'loom')
+    # .Object@filename <- name
+    .Object@shape <- dim(.Object['/matrix'])
     return(.Object)
   }
 )
@@ -39,7 +45,7 @@ setMethod(
 #'
 #' @param object A loom object
 #'
-#' @return TRUE if a valid loom object
+#' @return None, errors if object is an invalid loom object
 #'
 validateLoom <- function(object) {
   # A loom file is a specific HDF5
@@ -51,9 +57,10 @@ validateLoom <- function(object) {
   if (root.datasets != '/matrix') {
     stop("The root dataset must be called '/matrix'")
   }
-  dim.matrix <- object[root.datasets]@dim # Rows x Columns
   # There must be groups called '/col_attrs', '/row_attrs', and '/layers'
-  required.groups <- c('/col_attrs', '/row_attrs', '/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)
   group.msg <- paste0(
     "There can only be three groups in the loom file: '",
@@ -66,25 +73,32 @@ validateLoom <- function(object) {
   if (!all(required.groups %in% root.groups)) {
     stop(group.msg)
   }
-  vapply(
+  unlist(x = sapply(
     X = required.groups[1:2],
     FUN = function(group) {
-      if (length(x = list.groups(.Object = object, path = 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) {
         stop(paste("Group", group, "cannot have subattributes"))
       }
-      for (dataset in list.datasets(.Object = object, path = group)) {
-        break
+      for (dataset in list.datasets(.Object = object[group])) {
+        if (object[dataset]@dim != 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)) {
+      stop(paste("All datasets in '/layers' must be", dim.matrix[1], 'by', dim.matrix[2]))
+    }
+  }
 }
 
 connect = function(filename, mode = "r+") {
   self <- new("loom", filename, mode)
-  self@filename <- filename
+  self@filename <- filename
   self@shape = dim(self["matrix"])
   return(self)
 }
@@ -114,10 +128,10 @@ map <- function(self, f_list = list(mean, var), MARGIN=1, chunksize=1000, select
         new_results <- apply(chunk, 1, FUN = f_list[[j]])
         results[[j]] <- c(results[[j]], new_results)
       }
-      ix <- ix + chunksize 
+      ix <- ix + chunksize
     }
   }
-  
+
   if (MARGIN==2) {
     results=list();
     for (j in 1:n_func) {
@@ -132,9 +146,9 @@ map <- function(self, f_list = list(mean, var), MARGIN=1, chunksize=1000, select
         new_results <- apply(chunk, 2, FUN = f_list[[j]])
         results[[j]] <- c(results[[j]], new_results)
       }
-      ix <- ix + chunksize 
+      ix <- ix + chunksize
     }
-  }  
+  }
   if (n_func == 1) return(results[[1]])
   return(results)
 }
index 50847a355680fa236fd75ed39920edbd66538a5a..a5ca483b55b4f3ad60b6e2d761a6d11127e611d8 100644 (file)
@@ -8,3 +8,9 @@
 \description{
 A class for loom
 }
+\section{Slots}{
+
+\describe{
+\item{\code{}}{}
+}}
+
diff --git a/man/validateLoom.Rd b/man/validateLoom.Rd
new file mode 100644 (file)
index 0000000..5fa8ee2
--- /dev/null
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/loom.R
+\name{validateLoom}
+\alias{validateLoom}
+\title{Validate a loom object}
+\usage{
+validateLoom(object)
+}
+\arguments{
+\item{object}{A loom object}
+}
+\value{
+None, errors if object is an invalid loom object
+}
+\description{
+Validate a loom object
+}