## Useful functions for reading and writing files
#' @export
writeMM <- function(X, fname) {
stopifnot(is(X, 'dgCMatrix'))
nelem <- length(X@i)
nrow <- X@Dim[1]
ncol <- X@Dim[2]
writeLines(paste0(c('%%MatrixMarket matrix coordinate real general\n', nrow, ' ', ncol, ' ', nelem), collapse = ''), fname)
fwrite(data.table(X@i+1, rep(seq_len(ncol), times = diff(X@p)), X@x), fname, append = TRUE, sep = ' ')
}
#' @export
readMM <- function(fname, max_header_size = 100, nthreads = NULL) {
## First, figure out how many lines to skip
## Assumes that MM format has comments that start with %
nlines_skip <- 0
con <- file(fname, open = 'r')
for (i in seq_len(max_header_size)) {
line <- readLines(con, 1)
nlines_skip <- nlines_skip + 1
if (!grepl('^\\W*\\%', line)) {
## This is the line with dimension information
## We need dimension information to handle empty rows and columns
nrow <- as.integer(strsplit(line, ' ')[[1]][1])
ncol <- as.integer(strsplit(line, ' ')[[1]][2])
break
}
}
close(con)
if (is.null(nthreads)) {
nthreads <- data.table::getDTthreads()
}
## Then, read the file and make a matrix
with(
fread(fname, skip = nlines_skip, nThread = nthreads),
Matrix::sparseMatrix(i = V1, j = V2, x = V3, dims = c(nrow, ncol))
)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.