tests/testthat/helper-gen_adata.R

gen_vstr_recarray <- function(m, n, dtype = NULL) {
  size <- m * n
  lengths <- as.integer(runif(size, 3, 5))
  let <- c(letters, LETTERS)
  gen_word <- function(l) paste(sample(let, l, replace = TRUE), collapse = "")
  colnam <- sapply(seq_len(n), function(i) gen_word(5))
  arr <- matrix(sapply(lengths, gen_word), nrow = m, dimnames = list(NULL, colnam))
  df <- as.data.frame(arr)
  pd <- reticulate::import("pandas", convert = FALSE)
  df <- pd$DataFrame(arr, columns = colnam)
  df
  # TODO: add records class
  # rec <- df$to_records(index = FALSE, column_dtypes = dtype)
  # rec
}

gen_typed_df <- function(n, index = NULL) {
  let <- c(letters, LETTERS)
  if (n > length(let)) {
    let <- let[seq_len(n / 2)]
  }

  sam1 <- sample(let, n, replace = TRUE)
  data.frame(
    row.names = index,
    cat = factor(sample(let, n, replace = TRUE)),
    cat_ordered = factor(sam1, levels = sort(unique(sam1))),
    int = as.integer(runif(n, -50, 50)),
    float = runif(n)
    # uint8 = ... how to, in r?
  )
}

gen_adata <- function(
  shape,
  obsm_types = c("matrix", "sparseMatrix", "data.frame"),
  varm_types = c("matrix", "sparseMatrix", "data.frame"),
  layer_types = c("matrix", "sparseMatrix")
) {
  M <- shape[[1]]
  N <- shape[[2]]

  obs_names <- paste0("cell", seq_len(M))
  var_names <- paste0("gene", seq_len(N))
  obs <- gen_typed_df(M, obs_names)
  var <- gen_typed_df(N, var_names)
  # for #147
  obs$obs_cat <- obs$cat; obs$cat <- NULL
  var$var_cat <- var$cat; var$cat <- NULL

  obsm <- list(
    array = matrix(runif(M * 50), nrow = M),
    sparse = Matrix::rsparsematrix(M, 100, density = 0.1),
    df = gen_typed_df(M, obs_names)
  )
  for (key in names(obsm)) {
    type_match <- sapply(obsm_types, function(typ) inherits(obsm[[key]], typ))
    if (!any(type_match)) {
      obsm[[key]] <- NULL
    }
  }
  varm <- list(
    array = matrix(runif(N * 50), nrow = N),
    sparse = Matrix::rsparsematrix(N, 100, density = 0.1),
    df = gen_typed_df(N, var_names)
  )
  for (key in names(varm)) {
    type_match <- sapply(varm_types, function(typ) inherits(varm[[key]], typ))
    if (!any(type_match)) {
      varm[[key]] <- NULL
    }
  }
  layers <- list(
    array = matrix(runif(M * N), nrow = M),
    sparse = Matrix::rsparsematrix(M, N, density = 0.1)
  )
  obsp <- list(
    array = matrix(runif(M * M), nrow = M),
    sparse = Matrix::rsparsematrix(M, M, density = 0.1)
  )
  varp <- list(
    array = matrix(runif(N * N), nrow = N),
    sparse = Matrix::rsparsematrix(N, N, density = 0.1)
  )
  uns <- list(
    O_recarray = gen_vstr_recarray(N, 5)#,
    # U_recarray=gen_vstr_recarray(N, 5, "U4")
  )

  ad <- AnnData(
    X = Matrix::Matrix(matrix(rbinom(M * N, 100, 0.005), nrow = M), sparse = TRUE),
    obs = obs,
    var = var,
    obsm = obsm,
    varm = varm,
    layers = layers,
    obsp = obsp,
    varp = varp,
    uns = uns
  )

  ad
}

Try the anndata package in your browser

Any scripts or data that you put into this service are public.

anndata documentation built on March 31, 2023, 10:02 p.m.