added first versions of connect and map functions
authorRahul Satija <rsatija@nygenome.org>
Sat, 21 Oct 2017 20:23:57 +0000 (16:23 -0400)
committerRahul Satija <rsatija@nygenome.org>
Sat, 21 Oct 2017 20:23:57 +0000 (16:23 -0400)
R/loom.R

index 77c29d45fcbf798b8e8e53ccfb9835dcf2afff29..10f31f57769d3a290c20f91294fdccc176a84c30 100644 (file)
--- a/R/loom.R
+++ b/R/loom.R
@@ -10,8 +10,11 @@ NULL
 #'
 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'
+    version = 'ANY',
+    filename = 'ANY',
+    shape = "vector"
   ),
   contains = 'H5File'
 )
@@ -27,7 +30,64 @@ setMethod(
       name = name,
       mode = mode
     )
-    .Object@version <- packageVersion(pkg = 'loom')
+    #.Object@version <- packageVersion(pkg = 'loom')
     return(.Object)
   }
 )
+
+connect = function(filename, mode = "r+") {
+  self <- new("loom", filename, mode)
+  self@filename <- filename
+  self@shape = dim(self["matrix"])
+  return(self)
+}
+
+
+#need to comment
+#need to add progress bar
+#but otherwise, pretty cool
+#for paul to try :
+# f <- connect("~/Downloads/10X43_1.loom")
+# mean_var = map(f,f_list = c(mean,var),chunksize = 5000)
+# nGene <- map(f, f_list = function(x) length(which(x>0)), MARGIN = 2)
+map <- function(self, f_list = list(mean, var), MARGIN=1, chunksize=1000, selection) {
+  n_func = length(f_list)
+  if (n_func==1) f_list=list(f_list)
+  if (MARGIN==1) {
+    results=list();
+    for (j in 1:n_func) {
+      results[[j]] <- numeric(0)
+    }
+    rows_per_chunk <- chunksize
+    ix <- 1
+    while (ix <= self@shape[1]) {
+      rows_per_chunk <- min(rows_per_chunk, self@shape[1]-ix+1)
+      chunk <- self["matrix"][ix:(ix + rows_per_chunk -1), ]
+      for(j in 1:n_func) {
+        new_results <- apply(chunk, 1, FUN = f_list[[j]])
+        results[[j]] <- c(results[[j]], new_results)
+      }
+      ix <- ix + chunksize 
+    }
+  }
+  
+  if (MARGIN==2) {
+    results=list();
+    for (j in 1:n_func) {
+      results[[j]] <- numeric(0)
+    }
+    cols_per_chunk <- chunksize
+    ix <- 1
+    while (ix <= self@shape[2]) {
+      cols_per_chunk <- min(cols_per_chunk, self@shape[2]-ix+1)
+      chunk <- self["matrix"][,ix:(ix + cols_per_chunk -1)]
+      for(j in 1:n_func) {
+        new_results <- apply(chunk, 2, FUN = f_list[[j]])
+        results[[j]] <- c(results[[j]], new_results)
+      }
+      ix <- ix + chunksize 
+    }
+  }  
+  if (n_func == 1) return(results[[1]])
+  return(results)
+}