Skip to content

Commit

Permalink
Style package
Browse files Browse the repository at this point in the history
  • Loading branch information
lazappi committed Oct 17, 2024
1 parent 7f821a1 commit b1b373d
Show file tree
Hide file tree
Showing 14 changed files with 182 additions and 139 deletions.
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* Fix correctly assign levels to factors in R reader with **anndata** v0.7 files (Fixes #122)
* Add environment for **anndata** v0.10.9
* Avoid deprecation warning due to setting `dtype` when creating Python `AnnData` objects
* Standardise code styling using **{styler}**

## zellkonverter 1.15.3 (2024-10-04)

Expand Down
51 changes: 30 additions & 21 deletions R/AnnData2SCE.R
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
#'
#' If `skip_assays = TRUE`, empty sparse matrices are created for all assays,
#' regardless of whether they might be convertible to an R format or not.
#' In both cases, the user is expected to fill in the assays on the R side,
#' see [`readH5AD()`] for an example.
#' In both cases, the user is expected to fill in the assays on the R side.
#'
#' We attempt to convert between items in the \linkS4class{SingleCellExperiment}
#' [`metadata()`] slot and the `AnnData` `uns` slot. If an item cannot be
Expand Down Expand Up @@ -98,12 +97,10 @@ NULL
#' @importFrom methods selectMethod is
#' @importFrom S4Vectors DataFrame make_zero_col_DFrame
#' @importFrom reticulate import_builtins
AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
var = TRUE, obs = TRUE, varm = TRUE, obsm = TRUE,
varp = TRUE, obsp = TRUE, raw = FALSE,
skip_assays = FALSE, hdf5_backed = TRUE,
verbose = NULL) {

AnnData2SCE <- function(
adata, X_name = NULL, layers = TRUE, uns = TRUE,
var = TRUE, obs = TRUE, varm = TRUE, obsm = TRUE, varp = TRUE, obsp = TRUE,
raw = FALSE, skip_assays = FALSE, hdf5_backed = TRUE, verbose = NULL) {
# In case the user accidentally passes an AnnDataR6 object
if (is(adata, "AnnDataR6")) {
.ui_warn(paste(
Expand Down Expand Up @@ -254,17 +251,24 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
}

reddim_list <- .convert_anndata_slot(
adata, "obsm", py_to_r(adata$obsm_keys()), "reducedDims", select = obsm
adata, "obsm",
py_to_r(adata$obsm_keys()),
"reducedDims",
select = obsm
)
reddim_list <- lapply(reddim_list, as.matrix)

varp_list <- .convert_anndata_slot(
adata, "varp", py_builtins$list(adata$varp$keys()), "rowPairs",
adata, "varp",
py_builtins$list(adata$varp$keys()),
"rowPairs",
select = varp
)

obsp_list <- .convert_anndata_slot(
adata, "obsp", py_builtins$list(adata$obsp$keys()), "colPairs",
adata, "obsp",
py_builtins$list(adata$obsp$keys()),
"colPairs",
select = obsp
)

Expand Down Expand Up @@ -312,12 +316,19 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
)
colnames(raw_x$mat) <- colnames(output)

raw_rowData <- .convert_anndata_df(py_to_r(adata$raw$var), "raw var",
"raw rowData", select = TRUE)
raw_rowData <- .convert_anndata_df(
py_to_r(adata$raw$var),
"raw var",
"raw rowData",
select = TRUE
)

raw_varm_list <- .convert_anndata_slot(
adata, "varm", py_builtins$list(adata$raw$varm$keys()),
"raw rowData$varm", select = TRUE, raw = TRUE
adata,
"varm",
py_builtins$list(adata$raw$varm$keys()),
"raw rowData$varm",
select = TRUE, raw = TRUE
)

if (length(raw_varm_list) > 0) {
Expand All @@ -342,7 +353,7 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,

#' @importFrom Matrix t
.extract_or_skip_assay <- function(skip_assays, hdf5_backed, dims, mat,
filepath, name) {
filepath, name) {
skipped <- FALSE

if (isTRUE(skip_assays)) {
Expand Down Expand Up @@ -411,8 +422,7 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
}

.convert_anndata_slot <- function(adata, slot_name, slot_keys, to_name,
select = TRUE, raw = FALSE) {

select = TRUE, raw = FALSE) {
verbose <- parent.frame()$verbose

if (isFALSE(select)) {
Expand Down Expand Up @@ -456,7 +466,7 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
}

.convert_anndata_list <- function(adata_list, parent,
keys = names(adata_list)) {
keys = names(adata_list)) {
py_builtins <- import_builtins()

converted_list <- list()
Expand Down Expand Up @@ -578,7 +588,6 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
}

.convert_anndata_df <- function(adata_df, slot_name, to_name, select = TRUE) {

verbose <- parent.frame()$verbose

if (isFALSE(select)) {
Expand All @@ -600,7 +609,7 @@ AnnData2SCE <- function(adata, X_name = NULL, layers = TRUE, uns = TRUE,
select <- setdiff(select, missing)
}
} else {
select <- colnames(adata_df)
select <- colnames(adata_df)
}

df <- adata_df[, select, drop = FALSE]
Expand Down
33 changes: 15 additions & 18 deletions R/SCE2AnnData.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@
#' @importFrom utils capture.output
#' @importFrom S4Vectors metadata make_zero_col_DFrame
#' @importFrom reticulate import r_to_py py_to_r
SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
rowData = TRUE, varm = TRUE, reducedDims = TRUE,
metadata = TRUE, colPairs = TRUE, rowPairs = TRUE,
skip_assays = FALSE, verbose = NULL) {
SCE2AnnData <- function(
sce, X_name = NULL, assays = TRUE, colData = TRUE,
rowData = TRUE, varm = TRUE, reducedDims = TRUE,
metadata = TRUE, colPairs = TRUE, rowPairs = TRUE,
skip_assays = FALSE, verbose = NULL) {
anndata <- import("anndata")

# Create a list to store parts of the AnnData
Expand Down Expand Up @@ -132,7 +133,6 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
adata_list$varm <- varm_list
cli::cli_progress_done()
}

} else {
.ui_info("{.field rowData$varm} is empty and was skipped")
}
Expand All @@ -142,7 +142,8 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
} else {
sce <- .store_non_atomic(sce, "rowData")
adata_list$var <- .convert_sce_df(rowData(sce), "rowData", "var",
select = rowData)
select = rowData
)
}

if (is.null(adata_list$var)) {
Expand All @@ -168,8 +169,9 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
)
red_dims <- as.list(reducedDims(sce))
if (is.character(reducedDims)) {
reducedDims <- .check_select(reducedDims, "reducedDims",
names(red_dims))
reducedDims <- .check_select(
reducedDims, "reducedDims", names(red_dims)
)
red_dims <- red_dims[reducedDims]
}
red_dims <- lapply(red_dims, .makeNumpyFriendly, transpose = FALSE)
Expand Down Expand Up @@ -278,10 +280,9 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
}

.store_non_atomic <- function(sce, slot = c("rowData", "colData")) {

slot <- match.arg(slot)

df <- switch (slot,
df <- switch(slot,
rowData = rowData(sce),
colData = colData(sce)
)
Expand Down Expand Up @@ -316,15 +317,14 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,

if (slot == "rowData") {
rowData(sce) <- df
} else (
} else {
colData(sce) <- df
)
}

return(sce)
}

.check_select <- function(select, slot_name, options) {

verbose <- parent.frame()$verbose

if (!all(select %in% options)) {
Expand All @@ -341,7 +341,6 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
}

.convert_sce_df <- function(sce_df, slot_name, to_name, select = TRUE) {

if (ncol(sce_df) == 0) {
.ui_info("{.field {slot_name}} is empty and was skipped")
return(NULL)
Expand All @@ -352,7 +351,6 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
msg_done = "{.field {slot_name}} converted to {.field {to_name}}"
)
if (is.character(select)) {

select <- .check_select(select, slot_name, colnames(sce_df))

if (length(select) == 0) {
Expand All @@ -378,8 +376,7 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
}

.convert_sce_pairs <- function(sce, slot_name = c("rowPairs", "colPairs"),
to_name, select) {

to_name, select) {
slot_name <- match.arg(slot_name)


Expand All @@ -388,7 +385,7 @@ SCE2AnnData <- function(sce, X_name = NULL, assays = TRUE, colData = TRUE,
return(NULL)
}

pairs <- switch (slot_name,
pairs <- switch(slot_name,
rowPairs = as.list(rowPairs(sce, asSparse = TRUE)),
colPairs = as.list(colPairs(sce, asSparse = TRUE))
)
Expand Down
5 changes: 1 addition & 4 deletions R/basilisk.R
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,9 @@ NULL
#'
#' @export
AnnDataDependencies <- function(version = .AnnDataVersions) {

version <- match.arg(version)

switch (
version,
switch(version,
"0.7.6" = c(
"anndata==0.7.6",
"h5py==3.2.1",
Expand Down Expand Up @@ -160,7 +158,6 @@ AnnDataDependencies <- function(version = .AnnDataVersions) {
#' @include ui.R
#' @export
zellkonverterAnnDataEnv <- function(version = .AnnDataVersions) {

version <- match.arg(version)

basilisk::BasiliskEnvironment(
Expand Down
35 changes: 21 additions & 14 deletions R/read.R
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@
#' @importFrom basilisk basiliskRun
#' @importFrom methods slot
readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
reader = c("python", "R"), version = NULL, verbose = NULL,
...) {
reader = c("python", "R"), version = NULL, verbose = NULL,
...) {
file <- path.expand(file)
reader <- match.arg(reader)

Expand All @@ -77,7 +77,6 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
verbose = verbose,
...
)

} else if (reader == "R") {
sce <- .native_reader(file, backed = use_hdf5, verbose = verbose)
}
Expand All @@ -95,8 +94,11 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
)
adata <- anndata$read_h5ad(file, backed = if (backed) "r" else FALSE)
cli::cli_progress_done()
AnnData2SCE(adata, X_name = X_name, hdf5_backed = backed, verbose = verbose,
...)

AnnData2SCE(
adata,
X_name = X_name, hdf5_backed = backed, verbose = verbose, ...
)
}

#' @importFrom S4Vectors I DataFrame wmsg
Expand Down Expand Up @@ -230,7 +232,8 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
{
uns <- rhdf5::h5read(file, "uns")
uns <- .convert_element(
uns, "uns", file, recursive=TRUE
uns, "uns", file,
recursive = TRUE
)
metadata(sce) <- uns
},
Expand All @@ -244,7 +247,7 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
}

if (("X_name" %in% names(metadata(sce))) && ("X" %in% names(contents))) {
stopifnot(names(assays(sce))[1] == "X") #should be true b/c X is read 1st
stopifnot(names(assays(sce))[1] == "X") # should be true b/c X is read 1st
names(assays(sce))[1] <- metadata(sce)[["X_name"]]
metadata(sce)[["X_name"]] <- NULL
}
Expand All @@ -263,14 +266,14 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
x <- list()
}
x[[series[1]]] <- value

x
}

contents <- list()
for (i in seq_len(nrow(manifest))) {
components <- c(
strsplit(manifest[i, "group"], "/")[[1]],
manifest[i, "name"]
strsplit(manifest[i, "group"], "/")[[1]], manifest[i, "name"]
)
if (components[1] == "") {
components <- components[-1]
Expand All @@ -292,17 +295,19 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
} else {
mat <- HDF5Array::H5SparseMatrix(file, path)
}

if (!backed) {
if (DelayedArray::is_sparse(mat)) {
mat <- as(mat, "sparseMatrix")
} else {
mat <- as.matrix(mat)
}
}

mat
}

.convert_element <- function(obj, path, file, recursive=FALSE) {
.convert_element <- function(obj, path, file, recursive = FALSE) {
element_attrs <- rhdf5::h5readAttributes(file, path)

# Convert categorical element for AnnData v0.8+
Expand All @@ -314,7 +319,7 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,

ord <- as.logical(element_attrs[["ordered"]])

obj <- factor(levels[codes], levels=levels, ordered=ord)
obj <- factor(levels[codes], levels = levels, ordered = ord)
return(obj)
}

Expand All @@ -331,7 +336,8 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
obj[[k]] <- rhdf5::h5read(file, file.path(path, k))
obj[[k]] <- .convert_element(
obj[[k]], file.path(path, k),
file, recursive=TRUE
file,
recursive = TRUE
)
}
}
Expand All @@ -352,7 +358,8 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,

vec <- .convert_element(
vec, file.path(path, col_name),
file, recursive=FALSE
file,
recursive = FALSE
)

if (!is.factor(vec)) {
Expand Down Expand Up @@ -406,7 +413,7 @@ readH5AD <- function(file, X_name = NULL, use_hdf5 = FALSE,
.read_dim_mats <- function(file, path, fields) {
all.contents <- list()
for (field in names(fields)) {
# because everything's transposed.
# Because everything's transposed.
all.contents[[field]] <- t(rhdf5::h5read(file, file.path(path, field)))
}
all.contents
Expand Down
Loading

0 comments on commit b1b373d

Please sign in to comment.