#' 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)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.