Skip to content

Commit da283c7

Browse files
lazappircannood
andauthored
Fix Bioc review issues (#372)
Co-authored-by: Robrecht Cannoodt <rcannood@gmail.com>
1 parent f765aab commit da283c7

8 files changed

Lines changed: 75 additions & 36 deletions

File tree

.Rbuildignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
^doc$
1616
^Meta$
1717
^man/figures/*\.svg$
18+
^data$

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,4 @@ rsconnect/
6060
vignettes/data/*.h5ad
6161
/doc/
6262
/Meta/
63+
/data/

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: anndataR
22
Title: AnnData interoperability in R
3-
Version: 0.99.5
3+
Version: 0.99.6
44
Authors@R: c(
55
person("Robrecht", "Cannoodt", , "robrecht@data-intuitive.com", role = c("aut", "cre"),
66
comment = c(ORCID = "0000-0003-3641-729X", github = "rcannood")),

NEWS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# anndataR 0.99.6
2+
3+
- Use the correct mapping figure in the `SingleCellExperiment` usage vignette (PR #372)
4+
- Fix accessing layers keys for `ReticulateAnnData` (PR #372)
5+
- Minor updates to the Python usage vignette (PR #372)
6+
- Add the Python vignette to the **{pkgdown}** index (PR #372)
7+
18
# anndataR 0.99.4
29

310
- Address minor issues from Bioconductor checks (PR #371)

R/ReticulateAnnData.R

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ ReticulateAnnData <- R6::R6Class(
3434

3535
if (missing(value)) {
3636
# trackstatus: class=ReticulateAnnData, feature=get_X, status=done
37-
py_to_r(private$.py_anndata$X)
37+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "X"))
3838
} else {
3939
# trackstatus: class=ReticulateAnnData, feature=set_X, status=done
4040
value <- private$.validate_aligned_array(
@@ -44,7 +44,7 @@ ReticulateAnnData <- R6::R6Class(
4444
expected_rownames = rownames(self),
4545
expected_colnames = colnames(self)
4646
)
47-
private$.py_anndata$X <- r_to_py(value)
47+
reticulate::py_set_attr(private$.py_anndata, "X", r_to_py(value))
4848
self
4949
}
5050
},
@@ -57,9 +57,15 @@ ReticulateAnnData <- R6::R6Class(
5757
# trackstatus: class=ReticulateAnnData, feature=get_layers, status=done
5858
bi <- reticulate::import_builtins()
5959
out <- list()
60-
keys <- bi$list(private$.py_anndata$layers$keys())
60+
keys <- bi$list(reticulate::py_get_attr(
61+
private$.py_anndata,
62+
"layers"
63+
)$keys())
6164
for (name in keys) {
62-
out[[name]] <- py_to_r(private$.py_anndata$layers[[name]])
65+
out[[name]] <- py_to_r(reticulate::py_get_attr(
66+
private$.py_anndata,
67+
"layers"
68+
)[[name]])
6369
}
6470
out
6571
} else {
@@ -71,7 +77,7 @@ ReticulateAnnData <- R6::R6Class(
7177
expected_rownames = rownames(self),
7278
expected_colnames = colnames(self)
7379
)
74-
private$.py_anndata$layers <- r_to_py(value)
80+
reticulate::py_set_attr(private$.py_anndata, "layers", r_to_py(value))
7581
self
7682
}
7783
},
@@ -82,11 +88,11 @@ ReticulateAnnData <- R6::R6Class(
8288

8389
if (missing(value)) {
8490
# trackstatus: class=ReticulateAnnData, feature=get_obs, status=done
85-
py_to_r(private$.py_anndata$obs)
91+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "obs"))
8692
} else {
8793
# trackstatus: class=ReticulateAnnData, feature=set_obs, status=done
8894
value <- private$.validate_obsvar_dataframe(value, "obs")
89-
private$.py_anndata$obs <- r_to_py(value)
95+
reticulate::py_set_attr(private$.py_anndata, "obs", r_to_py(value))
9096
self
9197
}
9298
},
@@ -97,11 +103,11 @@ ReticulateAnnData <- R6::R6Class(
97103

98104
if (missing(value)) {
99105
# trackstatus: class=ReticulateAnnData, feature=get_var, status=done
100-
py_to_r(private$.py_anndata$var)
106+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "var"))
101107
} else {
102108
# trackstatus: class=ReticulateAnnData, feature=set_var, status=done
103109
value <- private$.validate_obsvar_dataframe(value, "var")
104-
private$.py_anndata$var <- r_to_py(value)
110+
reticulate::py_set_attr(private$.py_anndata, "var", r_to_py(value))
105111
self
106112
}
107113
},
@@ -113,10 +119,17 @@ ReticulateAnnData <- R6::R6Class(
113119
if (missing(value)) {
114120
# trackstatus: class=ReticulateAnnData, feature=get_obs_names, status=done
115121
bi <- reticulate::import_builtins()
116-
reticulate::py_to_r(bi$list(private$.py_anndata$obs_names))
122+
reticulate::py_to_r(bi$list(reticulate::py_get_attr(
123+
private$.py_anndata,
124+
"obs_names"
125+
)))
117126
} else {
118127
# trackstatus: class=ReticulateAnnData, feature=set_obs_names, status=done
119-
private$.py_anndata$obs_names <- reticulate::r_to_py(value)
128+
reticulate::py_set_attr(
129+
private$.py_anndata,
130+
"obs_names",
131+
reticulate::r_to_py(value)
132+
)
120133
self
121134
}
122135
},
@@ -128,10 +141,17 @@ ReticulateAnnData <- R6::R6Class(
128141
if (missing(value)) {
129142
# trackstatus: class=ReticulateAnnData, feature=get_var_names, status=done
130143
bi <- reticulate::import_builtins()
131-
reticulate::py_to_r(bi$list(private$.py_anndata$var_names))
144+
reticulate::py_to_r(bi$list(reticulate::py_get_attr(
145+
private$.py_anndata,
146+
"var_names"
147+
)))
132148
} else {
133149
# trackstatus: class=ReticulateAnnData, feature=set_var_names, status=done
134-
private$.py_anndata$var_names <- reticulate::r_to_py(value)
150+
reticulate::py_set_attr(
151+
private$.py_anndata,
152+
"var_names",
153+
reticulate::r_to_py(value)
154+
)
135155
self
136156
}
137157
},
@@ -142,7 +162,7 @@ ReticulateAnnData <- R6::R6Class(
142162

143163
if (missing(value)) {
144164
# trackstatus: class=ReticulateAnnData, feature=get_obsm, status=done
145-
py_to_r(private$.py_anndata$obsm)
165+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "obsm"))
146166
} else {
147167
# trackstatus: class=ReticulateAnnData, feature=set_obsm, status=done
148168
value <- private$.validate_aligned_mapping(
@@ -151,7 +171,7 @@ ReticulateAnnData <- R6::R6Class(
151171
c(self$n_obs()),
152172
expected_rownames = rownames(self)
153173
)
154-
private$.py_anndata$obsm <- r_to_py(value)
174+
reticulate::py_set_attr(private$.py_anndata, "obsm", r_to_py(value))
155175
self
156176
}
157177
},
@@ -162,7 +182,7 @@ ReticulateAnnData <- R6::R6Class(
162182

163183
if (missing(value)) {
164184
# trackstatus: class=ReticulateAnnData, feature=get_varm, status=done
165-
py_to_r(private$.py_anndata$varm)
185+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "varm"))
166186
} else {
167187
# trackstatus: class=ReticulateAnnData, feature=set_varm, status=done
168188
value <- private$.validate_aligned_mapping(
@@ -171,7 +191,7 @@ ReticulateAnnData <- R6::R6Class(
171191
c(self$n_vars()),
172192
expected_rownames = colnames(self)
173193
)
174-
private$.py_anndata$varm <- r_to_py(value)
194+
reticulate::py_set_attr(private$.py_anndata, "varm", r_to_py(value))
175195
self
176196
}
177197
},
@@ -182,7 +202,7 @@ ReticulateAnnData <- R6::R6Class(
182202

183203
if (missing(value)) {
184204
# trackstatus: class=ReticulateAnnData, feature=get_obsp, status=done
185-
py_to_r(private$.py_anndata$obsp)
205+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "obsp"))
186206
} else {
187207
# trackstatus: class=ReticulateAnnData, feature=set_obsp, status=done
188208
value <- private$.validate_aligned_mapping(
@@ -192,7 +212,7 @@ ReticulateAnnData <- R6::R6Class(
192212
expected_rownames = rownames(self),
193213
expected_colnames = rownames(self)
194214
)
195-
private$.py_anndata$obsp <- r_to_py(value)
215+
reticulate::py_set_attr(private$.py_anndata, "obsp", r_to_py(value))
196216
self
197217
}
198218
},
@@ -203,7 +223,7 @@ ReticulateAnnData <- R6::R6Class(
203223

204224
if (missing(value)) {
205225
# trackstatus: class=ReticulateAnnData, feature=get_varp, status=done
206-
py_to_r(private$.py_anndata$varp)
226+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "varp"))
207227
} else {
208228
# trackstatus: class=ReticulateAnnData, feature=set_varp, status=done
209229
value <- private$.validate_aligned_mapping(
@@ -213,7 +233,7 @@ ReticulateAnnData <- R6::R6Class(
213233
expected_rownames = colnames(self),
214234
expected_colnames = colnames(self)
215235
)
216-
private$.py_anndata$varp <- r_to_py(value)
236+
reticulate::py_set_attr(private$.py_anndata, "varp", r_to_py(value))
217237
self
218238
}
219239
},
@@ -224,11 +244,11 @@ ReticulateAnnData <- R6::R6Class(
224244

225245
if (missing(value)) {
226246
# trackstatus: class=ReticulateAnnData, feature=get_uns, status=done
227-
py_to_r(private$.py_anndata$uns)
247+
py_to_r(reticulate::py_get_attr(private$.py_anndata, "uns"))
228248
} else {
229249
# trackstatus: class=ReticulateAnnData, feature=set_uns, status=done
230250
value <- private$.validate_named_list(value, "uns")
231-
private$.py_anndata$uns <- r_to_py(value)
251+
reticulate::py_set_attr(private$.py_anndata, "uns", r_to_py(value))
232252
self
233253
}
234254
}
@@ -380,13 +400,19 @@ ReticulateAnnData <- R6::R6Class(
380400
#' @description See the `n_obs` field in [AnnData-usage]
381401
n_obs = function() {
382402
private$.check_py_object_valid()
383-
as.integer(reticulate::py_to_r(private$.py_anndata$n_obs))
403+
as.integer(reticulate::py_to_r(reticulate::py_get_attr(
404+
private$.py_anndata,
405+
"n_obs"
406+
)))
384407
},
385408

386409
#' @description See the `n_vars` field in [AnnData-usage]
387410
n_vars = function() {
388411
private$.check_py_object_valid()
389-
as.integer(reticulate::py_to_r(private$.py_anndata$n_vars))
412+
as.integer(reticulate::py_to_r(reticulate::py_get_attr(
413+
private$.py_anndata,
414+
"n_vars"
415+
)))
390416
},
391417

392418
#' @description Get the underlying Python AnnData object

_pkgdown.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ navbar:
1313
href: articles/usage_seurat.html
1414
- text: Read/write SingleCellExperiment objects
1515
href: articles/usage_singlecellexperiment.html
16+
- text: Interact with Python AnnData objects
17+
href: articles/usage_python.html
1618
- text: -------
1719
- text: Development
1820
- text: Software design

man/figures/AnnData-SCE.png

17.7 KB
Loading

vignettes/usage_python.Rmd

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ vignette: >
1010

1111
```{r, include = FALSE}
1212
reticulate::py_require("mudata")
13+
reticulate::py_require("scanpy")
1314
1415
# Check if required Python packages are available
15-
python_available <- reticulate::py_available() &&
16-
reticulate::py_module_available("scanpy") &&
16+
python_available <- reticulate::py_module_available("scanpy") &&
1717
reticulate::py_module_available("mudata")
1818
1919
knitr::opts_chunk$set(
@@ -22,17 +22,19 @@ knitr::opts_chunk$set(
2222
# Set eval based on Python package availability
2323
eval = python_available
2424
)
25-
26-
if (!python_available) {
27-
message("Python packages scanpy and mudata are required to run this vignette. Code chunks will not be evaluated.")
28-
}
2925
```
3026

3127
# Introduction
3228

3329
`r Biocpkg("anndataR")` works with Python `AnnData` objects through `r CRANpkg("reticulate")`.
3430
You can load Python objects, apply Python functions to them, and convert them to `Seurat` or `SingleCellExperiment` objects.
3531

32+
```{r python_unavailable, eval=!python_available}
33+
message(
34+
"Python packages scanpy and mudata are required to run this vignette. Code chunks will not be evaluated."
35+
)
36+
```
37+
3638
## Prerequisites
3739

3840
This vignette requires Python with the _scanpy_ and _mudata_ packages installed.
@@ -43,7 +45,7 @@ If these are not available, the code chunks will not be evaluated but the exampl
4345
Install required Python packages if needed:
4446

4547
```{r python_setup, eval=FALSE}
46-
reticulate::py_install("scanpy")
48+
reticulate::py_require("scanpy")
4749
```
4850

4951
```{r load_libraries}
@@ -56,7 +58,7 @@ Load a dataset directly from _scanpy_:
5658

5759
```{r load_python_data}
5860
adata <- sc$datasets$pbmc3k_processed()
59-
print(adata)
61+
adata
6062
```
6163

6264
Apply _scanpy_ functions directly:
@@ -73,14 +75,14 @@ Convert to `SingleCellExperiment` (see `vignette("usage_singlecellexperiment")`)
7375

7476
```{r convert_to_sce}
7577
sce_obj <- adata$as_SingleCellExperiment()
76-
print(sce_obj)
78+
sce_obj
7779
```
7880

7981
Convert to `Seurat` (see `vignette("usage_seurat")`):
8082

8183
```{r convert_to_seurat}
8284
seurat_obj <- adata$as_Seurat()
83-
print(seurat_obj)
85+
seurat_obj
8486
```
8587

8688
# Multi-modal data with _mudata_

0 commit comments

Comments
 (0)