R/h5_write_results.R

Defines functions write_result_list

Documented in write_result_list

#' write result list as returned by deconvolute and
#' simulation functions recursively
#'
#' @param results.all list of lists, as generated by the deconvolution and
#' simulation functions
#' @param filename string, where should the data be stored?
#' @param group string, group name for the hdf5 file (NULL for top level)
#' @return NULL, function saves into ‘filename‘

write_result_list <- function(results.all, filename, group = NULL) {
  # results.all has to be output of deconvolute/simulation functions or
  # function will fail
  # any other case, try the usual structure
  if (!file.exists(filename)) rhdf5::h5createFile(filename)
  # if any object in the list is a list, call recursively
  if (any(sapply(results.all, is.list)) && !("model" %in% names(results.all))) {
    for (name in names(results.all)) {
      if (!is.null(group)) {
        groupname <- paste(group, name, sep = "/")
      }else{
        groupname <- name
      }
      # create a group for the sublist
      rhdf5::h5createGroup(filename, groupname)
      # recursion
      if (is.list(results.all[[name]])) {
        write_result_list(results.all[[name]], filename, groupname)
      }else{
        if (name == "bulk.props") {
          rhdf5::h5write(
            as.matrix(results.all[[name]]),
            filename,
            paste(groupname, "data", sep = "/")
          )
          rhdf5::h5write(
            as.vector(rownames(results.all[[name]])),
            filename,
            paste(groupname, "celltypeids", sep = "/")
          )
          rhdf5::h5write(
            as.vector(colnames(results.all[[name]])),
            filename,
            paste(groupname, "bulkids", sep = "/")
          )
        }
        if (name == "c.true") {
          rhdf5::h5write(
            as.matrix(results.all[[name]]),
            filename,
            paste(groupname, "data", sep = "/")
          )
          rhdf5::h5write(
            as.vector(rownames(results.all[[name]])),
            filename,
            paste(groupname, "celltypeids", sep = "/")
          )
          rhdf5::h5write(
            as.vector(colnames(results.all[[name]])),
            filename,
            paste(groupname, "bulkids", sep = "/")
          )
        }
        if (name == "c.true.coarsly") {
          rhdf5::h5write(
            as.matrix(results.all[[name]]),
            filename,
            paste(groupname, "data", sep = "/")
          )
          rhdf5::h5write(
            as.vector(rownames(results.all[[name]])),
            filename,
            paste(groupname, "celltypeids", sep = "/")
          )
          rhdf5::h5write(
            as.vector(colnames(results.all[[name]])),
            filename,
            paste(groupname, "bulkids", sep = "/")
          )
        }
      }
    }
  }else{
    # if no object in the list is itself a list, bottom level is reached
    # there are a number of possible values to be written
    if (!is.null(results.all[["est.props"]])) {
      rhdf5::h5createGroup(
        filename, paste(group, "est.props", sep = "/")
      )
      rhdf5::h5write(
        as.matrix(results.all[["est.props"]]),
        filename,
        paste(group, "est.props", "data", sep = "/")
      )
      rhdf5::h5write(
        as.vector(rownames(results.all[["est.props"]])),
        filename,
        paste(group, "est.props", "celltypeids", sep = "/")
      )
      rhdf5::h5write(
        as.vector(colnames(results.all[["est.props"]])),
        filename,
        paste(group, "est.props", "bulkids", sep = "/")
      )
    }
    if (!is.null(results.all[["sig.matrix"]])) {
      rhdf5::h5createGroup(filename, paste(group, "sig.matrix", sep = "/"))
      rhdf5::h5write(
        as.matrix(results.all[["sig.matrix"]]),
        filename,
        paste(group, "sig.matrix", "data", sep = "/")
      )
      rhdf5::h5write(
        as.vector(rownames(results.all[["sig.matrix"]])),
        filename,
        paste(group, "sig.matrix", "geneids", sep = "/")
      )
      rhdf5::h5write(
        as.vector(colnames(results.all[["sig.matrix"]])),
        filename,
        paste(group, "sig.matrix", "celltypeids", sep = "/")
      )
    }
    if (!is.null(results.all[["name"]])) {
      rhdf5::h5write(
        results.all[["name"]], filename, paste(group, "name", sep = "/")
      )
    }
    if (!is.null(results.all[["times"]])) {
      rhdf5::h5write(
        results.all[["times"]], filename, paste(group, "times", sep = "/")
      )
    }
    sub <- strsplit(group, "/")[[1]][length(strsplit(group, "/")[[1]])]
    if (sub == "c.estimated.list" || sub == "c.estimated.coarsly.list") {
      for (n in names(results.all)) {
        if (!is.null(results.all[[n]])) {
          rhdf5::h5createGroup(filename, paste(group, n, sep = "/"))
          rhdf5::h5write(
            as.matrix(results.all[[n]]),
            filename,
            paste(group, n, "data", sep = "/")
          )
          rhdf5::h5write(
            as.vector(rownames(results.all[[n]])),
            filename,
            paste(group, n, "celltypeids", sep = "/")
          )
          rhdf5::h5write(
            as.vector(colnames(results.all[[n]])),
            filename,
            paste(group, n, "bulkids", sep = "/")
          )
        }
      }
    }
  }
  return(NULL)
}
MarianSchoen/DMC documentation built on Aug. 2, 2022, 3:05 p.m.