1 Introduction

1.1 What is Scanpy?

The scanpy package is a scalable Python toolkit for analysing single-cell gene expression data. It includes functionality commonly used during an analysis of scRNA-seq data including quality control, clustering of cells and testing for marker genes. For more information please have a look at the Scanpy documentation or read the associated publication.

1.2 Why would I want to use it from R?

There are various reasons you may want to interact with scanpy from R. You may already be using scanpy for your project but want to use an R package for a section of your analysis or your project but be R based and you want to use some of Scanpy’s functionality.

1.3 What is covered in this tutorial?

This tutorial will cover how to set up a environment that lets you interact with scanpy from R. It will demonstrate some of the functions in scanpy but it won’t cover everything the package can do or how best to use scanpy for your analysis. For more details about what scanpy can do please refer to the tutorials and other information in the Scanpy documentation.

1.4 Formatting

This tutorial tries to use some formatting conventions to avoid confusion. Perhaps the most important is different coloured backgrounds to indicate R and Python code chunks.

An R code chunk looks like this:

# Some R code

And a Python code chunk looks like this:

# Some Python code

The output of code chunks will have a grey background regardless of the programming language:

print("Some R output")
## [1] "Some R output"
print("Some Python output")
## Some Python output

We also try to use these conventions in the text:

  • {package} - An R package
  • package::function() - A function in an R package
  • package - A Python package
  • package.function() - A function in a Python package
  • Emphasised - Some other important concept
  • code - Other parts of code including objects, variables etc. This is also used for files or directories.

2 Setting up

To use scanpy from R you will (unsurprisingly) need both an R and Python environment set up. If you are mostly an R user the easiest approach is to use the {renv} package to set up and manage these environments. This is what we will do for this tutorial. If you are primarily a Python user you may find it easier to create your own conda or virtualenv environment. The main thing is to have both R and Python available (with the required packages installed), however it is highly recommended you use some kind of environment system to improve the reproducibility of your project.

What is an environment?

An environment refers to all the software packages and versions that you currently have access to. Usually this is whatever is available on the main path of your computer which is referred to as the global or system environment. However there are several advantages to maintaining more control over the environment you are using.

Imagine you are using a software tool which depends on pkgA v1. What if you want to install another tool that depends on pkgA v2? You could either update pkgA which means the first tool would stop working or keep the current version and not be able to use the second tool. This is the problem that environment managers try to solve by allowing you to create isolated environments with specific package versions installed. This means we could have an environment with pkgA v1 installed for the first tool and switch to another environment with pkgA v2 installed when we want to use the second tool. For Python the two most commonly used environment managers are virtualenv and conda.

Environments can also help improve reproducibility by recording the specific versions of packages that are used for a project. This means that if someone else was to use your project they would install the same version and (should) get the same results. As the R language is more focused on interactive data analysis solving this problem is the goal of the R environment management package {renv}.

2.1 Using {renv}

The {renv} package helps you reproducible environments for an R project. These environments are designed to be isolated, portable and reproducible. This is similar to conda environments but they are confined to a specific project directory. Please refer to the {renv} documentation for more details.

2.1.1 Creating the R environment

To use {renv} we first need to make sure it is installed:

install.packages("renv")

We can then ask {renv} to create an environment for us:

renv::init()

This command creates a new renv/ folder where your installed packages (and some other things) will be stored and a renv.lock file which will be used to record the package versions. It will also create (or modify) the .Rprofile file to make sure the environment is activated. Once we have this environment activated we can install/remove packages but they will be kept separate from the global package environment. If you already have files with R code in this directory {renv} will attempt to find which packages you are using and install them into your new library. By default renv::init() will create the environment in the current working directory but you can also tell it to create it somewhere else by setting the project argument.

2.1.2 Creating the Python environment

As we are going to be using Python we need to make sure we have the {reticulate} package installed in our new environment:

renv::install("reticulate")

This package provides a set of tools for interoperability between Python and R (the Python equivalent is the rpy2 package). This includes calling Python functions from R, translating between Python and R objects and managing Python environments from R. For more details see the {reticulate} documentation.

Once {reticulate} is installed we can tell {renv} that we also want to use a Python environment:

renv::use_python()

Unless you specify a Python version with the python argument or the RETICULATE_PYTHON environment variable is set your default Python installation will be used. By default the type of environment created depends on your operating system (virtualenv on Linux/macOS or conda on Windows) but if you have a preference this can be controlled using the type argument.

If you choose not to use {renv} a Python environment can also be created using the reticulate::use_python() and reticulate::use_virtualenv()/reticulate::use_condaenv() functions.

2.2 Installing packages

2.2.1 R packages

Use the following command to install the R packages used during this tutorial:

pkgs <- c(
    "renv",
    "reticulate",
    "png",
    "ggplot2",
    "BiocManager",
    "Seurat"
)

bioc_pkgs <- c(
    "SingleCellExperiment",
    "scater",
    "multtest"
)

# If you are using an {renv} environment
renv::install(pkgs)

# Otherwise do it the normal way
install.packages(pkgs)

# Install Bioconductor packages
BiocManager::install(bioc_pkgs, update = FALSE)

2.2.2 Python packages

The following Python packages are required for this tutorial:

py_pkgs <- c(
    "scanpy",
    "python-igraph",
    "louvain"
)

To install them from R we can use reticulate::py_install():

reticulate::py_install(py_pkgs)

If you are not using {renv}/{reticulate} to manage your Python environment please install them in the way you would normally.

2.2.3 {renv} snapshot

If you have chosen to use an {renv} environment you should run the renv::snapshot() command after installing packages. This records the changes you have made so they can be restored later if necessary.

renv::snapshot()

3 Alternative approaches

There are two approaches you can use to interact with Python packages from R, both of which we will describe here.

The first approach is to perform our analysis in an R Markdown document. R Markdown is a text-based document format that lets you combine text and code. When the document is rendered the code is evaluated and the results is included in the output document, which can be several different formats including HTML, PDF and DOCX. Although it has been primarily designed to be used with R code R Markdown supports “engines” for several programming languages including Python. R Markdown documents that include Python code maintain a single Python session for the all the code chunks in a document. This lets us create a single document that contains native R and Python code and lets us transfer object between them as required.

The second approach is to access scanpy functions from R using the {reticulate} interface. While this means we can’t copy Python code from examples directly it doesn’t lock us into using R Markdown and may be easier for those who are comfortable with R code but unfamiliar with Python. It is also possible to use this approach inside an R Markdown document rather than using native Python code.

If you are already using R Markdown documents for your analysis it likely makes sense for you to use that approach, otherwise the choice is up to you. Which approach you choose to use may depend on a range of factors including which programming language you are more comfortable with and how much of your analysis you intend to perform using either language.

4 The R Markdown approach

First let’s work through the R Markdown approach. We won’t cover the all the basics of R Markdown documents so if you haven’t used them before you may want to work through an introductory tutorial first.

We will start by loading some R libraries.

suppressPackageStartupMessages({
    library("reticulate")
    library("ggplot2")
    library("SingleCellExperiment")
    library("scater")
    library("Seurat")
})
## Warning: package 'S4Vectors' was built under R version 3.6.3
## Warning: package 'GenomeInfoDb' was built under R version 3.6.3
## Warning: package 'DelayedArray' was built under R version 3.6.3

We will also import scanpy in a Python chunk. A Python chunk begins with ```{python} instead of ```{r}. If you are using RStudio you can easily create on by clicking Insert > Python in the R Markdown editor pane.

import scanpy as sc
## /Users/luke.zappia/Documents/Projects/scanpy-in-R/renv/python/condaenvs/renv-python/lib/python3.6/site-packages/anndata/_core/anndata.py:21: FutureWarning: pandas.core.index is deprecated and will be removed in a future version.  The public classes are available in the top-level namespace.
##   from pandas.core.index import RangeIndex

4.1 Load data

As this tutorial focuses on the interaction between R and scanpy rather than the features of the package itself we will work with the processed PBMC3K dataset. This is a dataset of around 3000 peripheral blood mononuclear cells that was produced by 10x Genomics and has been processed as described in the scanpy PBMC3K tutorial.

NOTE: Running this command will download the dataset to a data/ directory if it doesn’t already exist.

adata = sc.datasets.pbmc3k_processed()

The data is returned as an AnnData object. This is similar to a SingleCellExperiment or Seurat object used by R packages and stores matrices of expression values as well as annotation for cells and features and various other data structures created during analysis such as embeddings and nearest neighbour graphs. A key difference is that AnnData matrices are transposed compared to those used by R packages, the rows represent cells and the columns represent features. Please refer to the anndata documentation for more details about this data structure.

Let’s have a look at what this one includes.

adata
## AnnData object with n_obs × n_vars = 2638 × 1838 
##     obs: 'n_genes', 'percent_mito', 'n_counts', 'louvain'
##     var: 'n_cells'
##     uns: 'draw_graph', 'louvain', 'louvain_colors', 'neighbors', 'pca', 'rank_genes_groups'
##     obsm: 'X_pca', 'X_tsne', 'X_umap', 'X_draw_graph_fr'
##     varm: 'PCs'

4.2 Using scanpy functions

With the R Markdown approach using scanpy functions is easy. We simply create a new Python chunk and use standard Python commands. For example, let’s plot a UMAP of the Louvain clustering already stored in the object:

sc.pl.umap(adata, color='louvain')

We could also re-cluster the data at a higher resolution and re-plot the UMAP. We store the new clustering in an observation variable called “louvain_2”.

sc.tl.louvain(adata, resolution=2, key_added='louvain_2')
sc.pl.umap(adata, color='louvain_2')

4.3 Converting from Python to R

Python objects can be accessed from R using the special py variable (as long as we have loaded the {reticulate} package). This variable is accessed as an R list where each item in the list is an object in the Python session. For example let’s create a list in Python:

a_list = ['My', 'list', 'of', 'things']
print(a_list)
## ['My', 'list', 'of', 'things']

We can access that exact same list in R:

py$a_list
## [1] "My"     "list"   "of"     "things"

We can even modify the list in R…

py$a_list[4] <- "words"

…and the changes are changes can be seen in Python.

print(a_list)
## ['My', 'list', 'of', 'words']

For several common data structures the objects are automatically converted to their equivalent type in R.

class(py$a_list)
## [1] "character"

This is also true for some more complex data structures. For example, variables associated with observations (cells) are stored as a pandas DataFrame in our AnnData object but are converted to a data.frame in R.

class(py$adata$obs)
## [1] "data.frame"

We can use this object directly in our R session. For example let’s plot the number of genes expressed per cell against the number of counts using {ggplot2}.

ggplot(py$adata$obs, aes(x = n_counts, y = n_genes, colour = louvain)) +
    geom_point()

4.3.1 Creating a SingleCellExperiment object from AnnData

Many of the R packages for scRNA-seq analysis are part of the Bioconductor project and use the SingleCellExperiment object. To make use of these packages you may need to create one of these objects. Many of the parts of SingleCellExperiment and AnnData objects are equivalent and can be converted directly.

sce <- SingleCellExperiment(
    assays      = list(logcounts = t(py$adata$X)),
    colData     = py$adata$obs,
    rowData     = py$adata$var,
    reducedDims = list(umap = py$adata$obsm["X_umap"])
)
sce
## class: SingleCellExperiment 
## dim: 1838 2638 
## metadata(0):
## assays(1): logcounts
## rownames(1838): TNFRSF4 CPSF3L ... S100B PRMT2
## rowData names(1): n_cells
## colnames(2638): AAACATACAACCAC-1 AAACATTGAGCTAC-1 ... TTTGCATGAGAGGC-1
##   TTTGCATGCCTCAC-1
## colData names(5): n_genes percent_mito n_counts louvain louvain_2
## reducedDimNames(1): umap
## spikeNames(0):
## altExpNames(0):

Note that we haven’t copied everything to our new SingleCellExperiment but only what is directly mappable and most likely to be useful. If you need some of the other information stored in the AnnData object it should be possible to transfer that as well but you would need to decide where it best fits in the SingleCellExperiment. We have also made some decisions about how to name things. For example we have stored the main X expression matrix in the logcounts assay as this represents a similar transformation of the expression data and functions in some packages expect this assay to exist.

To show that we can use this object let’s plot our UMAP again in R using the {scater} package.

plotReducedDim(sce, "umap", colour_by = "louvain")

Because the embedding has already been calculated in scanpy we use the scater::plotReducedDim() function here but we could also ask {scater} to computer new embeddings for us.

4.3.2 Creating a Seurat object from AnnData

The other object that is often used by R scRNA-seq analysis packages is the Seurat object. We can create one of these in a similar way. Please see the {Seurat} documentation for more details about this object.

# Get the expression matrix
exprs <- t(py$adata$X)
colnames(exprs) <- py$adata$obs_names$to_list()
rownames(exprs) <- py$adata$var_names$to_list()
# Create the Seurat object
seurat <- CreateSeuratObject(exprs)
# Set the expression assay
seurat <- SetAssayData(seurat, "data", exprs)
# Add observation metadata
seurat <- AddMetaData(seurat, py$adata$obs)
# Add fetaure metadata
seurat[["RNA"]][["n_cells"]] <- py$adata$var["n_cells"]
# Add embedding
embedding <- py$adata$obsm["X_umap"]
rownames(embedding) <- py$adata$obs_names$to_list()
colnames(embedding) <- c("umap_1", "umap_2")
seurat[["umap"]] <- CreateDimReducObject(embedding, key = "umap_")
## Warning: No assay specified, setting assay as RNA by default.
seurat
## An object of class Seurat 
## 1838 features across 2638 samples within 1 assay 
## Active assay: RNA (1838 features)
##  1 dimensional reduction calculated: umap

The process for creating a Seurat object is more complex that creating a SingleCellExperiment and requires creating several other objects. The Seurat::CreateSeuratObject() function expects a single matrix that contains raw count data. We don’t have that here so we use the normalised expression matrix instead. If we did have counts it would be better to use those. Seurat objects can have multiple “assays” (the default is “RNA”) which can each have three data representations (“counts”, “data” and “scale.data”). We have placed the expression matrix in the “data” slot here but which is most appropriate depends on the data you are copying. Metadata for observations can be added using the Seurat::AddMetaData() function but feature metadata must be added manually to the correct assay. We also add a DimReduc object holding the UMAP embedding.

NOTE: The Seurat::ReadH5AD() function can be used to read the .h5ad format commonly used to save AnnData objects to disk. This is another way to convert between the formats and will produce a more complete conversion at the cost of writing to disk.

The functions in {Seurat} (and related packages) can now be used with this object. Let’s recreate our UMAP plot:

seurat <- SetIdent(seurat, value = "louvain")
DimPlot(seurat, reduction = "umap")

4.4 Converting from R to Python

The reverse conversion can be done in a similar way. Just like there is a special py variable in the R session there is a special r variable in the Python section. Here is a quick example:

another_list <- c("Some", "more", "things")

In Python the list looks like this.

r.another_list
## ['Some', 'more', 'things']

Notice that we use the . operator in Python rather than the $ operator we used in R.

4.4.1 Creating AnnData from SingleCellExperiment

Let’s pretend we have completed some analysis in our R session and we want to transfer the results back to our AnnData object in the Python section.

Because some of the parts of the SingleCellExperiment use non-standard classes (such as the Bioconductor DataFrame class) that can’t be automatically converted by {reticulate} it is easiest to first extract the parts we want in R.

exprs <- assay(sce, "logcounts")
col_data <- as.data.frame(colData(sce))
row_data <- as.data.frame(rowData(sce))
embedding <- reducedDim(sce, "umap")

We can then had any variables we want to our AnnData object in Python:

adata.obs['sce_louvain'] = r.col_data['louvain']

We could also create a new AnnData object by transferring everything we extracted from the SingleCellExperiment:

adata_sce = sc.AnnData(X = r.exprs.T, obs = r.col_data, var = r.row_data)
adata_sce.obsm['umap'] = r.embedding

This new AnnData can also be used with scanpy

sc.pl.umap(adata_sce, color='louvain')

4.4.2 Creating AnnData from Seurat

The process for creating an AnnData object from a Seurat object is very similar. First we extract the parts we want:

exprs <- GetAssayData(seurat)
meta <- seurat[[]]
feature_meta <- GetAssay(seurat)[[]]
embedding <- Embeddings(seurat, "umap")

Then we can construct a new AnnData in a Python chunk.

adata_seurat = sc.AnnData(X = r.exprs.T, obs = r.meta, var = r.feature_meta)
adata_seurat.obsm['umap'] = r.embedding

This object should also be compatible with scanpy functions.

sc.pl.umap(adata_seurat, color='louvain')

5 The {reticulate} approach

The {reticulate} approach involves calling scanpy functions from an R session. This means that we keep everything inside a single R session and only need to write R code but the downside is we cannot directly copy examples that have been written in Python.

We first need to load the R packages we need.

suppressPackageStartupMessages({
    library("reticulate")
    library("ggplot2")
    library("SingleCellExperiment")
    library("scater")
    library("Seurat")
})

This time to load a Python package we don’t use a Python chunk but we use the reticulate::import() function.

sc <- import("scanpy")

5.1 Load data

To load the dataset we will use the scanpy.pbmc3k_processed() function. To use this from R the syntax is mostly the same but we replace the . characters between modules with the $ operator in R.

adata <- sc$datasets$pbmc3k_processed()

If we print this object we should see the same output we saw in the corresponding Python chunk in the R Markdown approach.

adata
## AnnData object with n_obs × n_vars = 2638 × 1838 
##     obs: 'n_genes', 'percent_mito', 'n_counts', 'louvain'
##     var: 'n_cells'
##     uns: 'draw_graph', 'louvain', 'louvain_colors', 'neighbors', 'pca', 'rank_genes_groups'
##     obsm: 'X_pca', 'X_tsne', 'X_umap', 'X_draw_graph_fr'
##     varm: 'PCs'

5.2 Using scanpy functions

Other scanpy functions can be called from R in the same way. Here is an example adding another clustering resolution.

sc$tl$louvain(adata, resolution = 2, key_added = "louvain_2")

colnames(adata$obs)
## [1] "n_genes"      "percent_mito" "n_counts"     "louvain"      "louvain_2"

NOTE: We don’t show a plotting example here as the plot will appear in a new window. It is still possible to use these function though.

5.3 Converting from Python to R

Accessing parts of our AnnData object is simpler than it was with the R Markdown approach. We don’t have to worry about a special variable we can just extract information from the AnnData using standard R operators. This works particularly well for those data structures that are automatically converted by {reticulate}.

head(adata$obs)
##                  n_genes percent_mito n_counts         louvain louvain_2
## AAACATACAACCAC-1     781  0.030177759     2419     CD4 T cells         6
## AAACATTGAGCTAC-1    1352  0.037935957     4903         B cells         1
## AAACATTGATCAGC-1    1131  0.008897362     3147     CD4 T cells        10
## AAACCGTGCTTCCG-1     960  0.017430846     2639 CD14+ Monocytes         5
## AAACCGTGTATGCG-1     522  0.012244898      980        NK cells         8
## AAACGCACTGGTAC-1     782  0.016643550     2163     CD8 T cells         9
head(adata$var)
##          n_cells
## TNFRSF4      155
## CPSF3L       202
## ATAD3C         9
## C1orf86      501
## RER1         608
## TNFRSF25     170
adata$X[1:5, 1:5]
##            [,1]       [,2]        [,3]       [,4]       [,5]
## [1,] -0.1714695 -0.2808120 -0.04667679 -0.4751688 -0.5440238
## [2,] -0.2145822 -0.3726529 -0.05480444 -0.6833915  0.6339506
## [3,] -0.3768875 -0.2950843 -0.05752750 -0.5209721  1.3326473
## [4,] -0.2852409 -0.2817346 -0.05222673 -0.4849288  1.5726788
## [5,] -0.2564834 -0.2203940 -0.04680008 -0.3458593 -0.3334090

We can also directly pass these objects to R functions:

ggplot(adata$obs, aes(x = n_counts, y = n_genes, colour = louvain)) +
    geom_point()

Some objects cannot be converted automatically. In this case you need to ask {reticulate} to run some Python code to convert the object to a format R can understand. We can them get the result from the magic py variable.

py_run_string("draw_graph = r.adata.uns['draw_graph']")

py$draw_graph
## $params
## $params$layout
## [1] "fr"
## 
## $params$random_state
## [1] 0

5.3.1 Creating a SingleCellExperiment object from AnnData

Creating a SingleCellExperiment is very similar to what we did in the R Markdown approach but with slightly simpler code.

sce <- SingleCellExperiment(
    assays      = list(logcounts = t(adata$X)),
    colData     = adata$obs,
    rowData     = adata$var,
    reducedDims = list(umap = adata$obsm["X_umap"])
)
sce
## class: SingleCellExperiment 
## dim: 1838 2638 
## metadata(0):
## assays(1): logcounts
## rownames(1838): TNFRSF4 CPSF3L ... S100B PRMT2
## rowData names(1): n_cells
## colnames(2638): AAACATACAACCAC-1 AAACATTGAGCTAC-1 ... TTTGCATGAGAGGC-1
##   TTTGCATGCCTCAC-1
## colData names(5): n_genes percent_mito n_counts louvain louvain_2
## reducedDimNames(1): umap
## spikeNames(0):
## altExpNames(0):

We can then use this object as normal:

plotReducedDim(sce, "umap", colour_by = "louvain")

5.3.2 Creating a Seurat object from AnnData

The same is true when creating a Seurat object.

exprs <- t(adata$X)
colnames(exprs) <- adata$obs_names$to_list()
rownames(exprs) <- adata$var_names$to_list()
# Create the Seurat object
seurat <- CreateSeuratObject(exprs)
# Set the expression assay
seurat <- SetAssayData(seurat, "data", exprs)
# Add observation metadata
seurat <- AddMetaData(seurat, adata$obs)
# Add fetaure metadata
seurat[["RNA"]][["n_cells"]] <- adata$var["n_cells"]
# Add embedding
embedding <- adata$obsm["X_umap"]
rownames(embedding) <- adata$obs_names$to_list()
colnames(embedding) <- c("umap_1", "umap_2")
seurat[["umap"]] <- CreateDimReducObject(embedding, key = "umap_")
## Warning: No assay specified, setting assay as RNA by default.
seurat
## An object of class Seurat 
## 1838 features across 2638 samples within 1 assay 
## Active assay: RNA (1838 features)
##  1 dimensional reduction calculated: umap

This should then function as a normal Seurat object:

seurat <- SetIdent(seurat, value = "louvain")
DimPlot(seurat, reduction = "umap")

5.4 Converting from R to Python

Converting from R to Python is a bit different than when using the R Markdown approach as we can do everything in the R session in many cases.

var <- "n_genes"

head(adata$obs[var])
##                  n_genes
## AAACATACAACCAC-1     781
## AAACATTGAGCTAC-1    1352
## AAACATTGATCAGC-1    1131
## AAACCGTGCTTCCG-1     960
## AAACCGTGTATGCG-1     522
## AAACGCACTGGTAC-1     782

When this doesn’t work we can use the magic r variable with the reticulate::py_run_string() function (as shown before) or the reticulate::py_eval() function. Which one to use depends on what you are trying to do.

py_eval("r.adata.obs[r.var].head()")
## index
## AAACATACAACCAC-1     781
## AAACATTGAGCTAC-1    1352
## AAACATTGATCAGC-1    1131
## AAACCGTGCTTCCG-1     960
## AAACCGTGTATGCG-1     522
## Name: n_genes, dtype: int64

5.4.1 Creating AnnData from SingleCellExperiment

Because we are working only in R we don’t need to first extract and convert the part of the SingleCellExperiment we want before creating a new AnnData. Instead we can do everything at once.

adata_sce <- sc$AnnData(
    X   = t(logcounts(sce)),
    obs = as.data.frame(colData(sce)),
    var = as.data.frame(rowData(sce))
)
adata_sce$obsm$update(umap = reducedDim(sce, "umap"))

adata_sce
## AnnData object with n_obs × n_vars = 2638 × 1838 
##     obs: 'n_genes', 'percent_mito', 'n_counts', 'louvain', 'louvain_2'
##     var: 'n_cells'
##     obsm: 'umap'

5.4.2 Creating AnnData from Seurat

The same is true when creating a new AnnData from a Seurat object.

adata_seurat <- sc$AnnData(
    X   = t(GetAssayData(seurat)),
    obs = seurat[[]],
    var = GetAssay(seurat)[[]]
)
adata_seurat$obsm$update(umap = Embeddings(seurat, "umap"))

adata_seurat
## AnnData object with n_obs × n_vars = 2638 × 1838 
##     obs: 'orig.ident', 'nCount_RNA', 'nFeature_RNA', 'n_genes', 'percent_mito', 'n_counts', 'louvain', 'louvain_2'
##     var: 'n_cells'
##     obsm: 'umap'

6 Environments

6.1 Session information

Details of the R session when building this tutorial.

Click here

sessioninfo::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 3.6.2 (2019-12-12)
##  os       macOS Catalina 10.15.3      
##  system   x86_64, darwin15.6.0        
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       Europe/Berlin               
##  date     2020-04-27                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  ! package              * version    date       lib source        
##  P ape                    5.3        2019-03-17 [?] CRAN (R 3.6.0)
##  P assertthat             0.2.1      2019-03-21 [?] CRAN (R 3.6.0)
##    beeswarm               0.2.3      2016-04-25 [1] CRAN (R 3.6.0)
##  P bibtex                 0.4.2.2    2020-01-02 [?] CRAN (R 3.6.0)
##    Biobase              * 2.46.0     2019-10-29 [1] Bioconductor  
##    BiocGenerics         * 0.32.0     2019-10-29 [1] Bioconductor  
##    BiocNeighbors          1.4.2      2020-02-29 [1] Bioconductor  
##    BiocParallel         * 1.20.1     2019-12-21 [1] Bioconductor  
##    BiocSingular           1.2.2      2020-02-14 [1] Bioconductor  
##    bitops                 1.0-6      2013-08-17 [1] CRAN (R 3.6.0)
##  P bookdown               0.18       2020-03-05 [?] CRAN (R 3.6.0)
##  P caTools                1.18.0     2020-01-17 [?] CRAN (R 3.6.0)
##  P cli                    2.0.2      2020-02-28 [?] CRAN (R 3.6.0)
##  P cluster                2.1.0      2019-06-19 [?] CRAN (R 3.6.2)
##  P codetools              0.2-16     2018-12-24 [?] CRAN (R 3.6.2)
##  P colorspace             1.4-1      2019-03-18 [?] CRAN (R 3.6.0)
##  P cowplot                1.0.0      2019-07-11 [?] CRAN (R 3.6.0)
##  P crayon                 1.3.4      2017-09-16 [?] CRAN (R 3.6.0)
##  P data.table             1.12.8     2019-12-09 [?] CRAN (R 3.6.0)
##    DelayedArray         * 0.12.3     2020-04-09 [1] Bioconductor  
##    DelayedMatrixStats     1.8.0      2019-10-29 [1] Bioconductor  
##    digest                 0.6.25     2020-02-23 [1] CRAN (R 3.6.0)
##  P dplyr                  0.8.5      2020-03-07 [?] CRAN (R 3.6.0)
##  P ellipsis               0.3.0      2019-09-20 [?] CRAN (R 3.6.0)
##    evaluate               0.14       2019-05-28 [1] CRAN (R 3.6.0)
##  P fansi                  0.4.1      2020-01-08 [?] CRAN (R 3.6.0)
##  P farver                 2.0.3      2020-01-16 [?] CRAN (R 3.6.0)
##  P fitdistrplus           1.0-14     2019-01-23 [?] CRAN (R 3.6.0)
##  P future                 1.16.0     2020-01-16 [?] CRAN (R 3.6.0)
##  P future.apply           1.4.0      2020-01-07 [?] CRAN (R 3.6.0)
##  P gbRd                   0.4-11     2012-10-01 [?] CRAN (R 3.6.0)
##  P gdata                  2.18.0     2017-06-06 [?] CRAN (R 3.6.0)
##    GenomeInfoDb         * 1.22.1     2020-03-27 [1] Bioconductor  
##    GenomeInfoDbData       1.2.2      2020-04-16 [1] Bioconductor  
##    GenomicRanges        * 1.38.0     2019-10-29 [1] Bioconductor  
##    ggbeeswarm             0.6.0      2017-08-07 [1] CRAN (R 3.6.0)
##  P ggplot2              * 3.3.0      2020-03-05 [?] CRAN (R 3.6.0)
##  P ggrepel                0.8.2      2020-03-08 [?] CRAN (R 3.6.0)
##  P ggridges               0.5.2      2020-01-12 [?] CRAN (R 3.6.0)
##  P globals                0.12.5     2019-12-07 [?] CRAN (R 3.6.0)
##  P glue                   1.4.0      2020-04-03 [?] CRAN (R 3.6.2)
##  P gplots                 3.0.3      2020-02-25 [?] CRAN (R 3.6.0)
##    gridExtra              2.3        2017-09-09 [1] CRAN (R 3.6.0)
##  P gtable                 0.3.0      2019-03-25 [?] CRAN (R 3.6.0)
##  P gtools                 3.8.2      2020-03-31 [?] CRAN (R 3.6.2)
##    htmltools              0.4.0      2019-10-04 [1] CRAN (R 3.6.0)
##  P htmlwidgets            1.5.1      2019-10-08 [?] CRAN (R 3.6.0)
##  P httr                   1.4.1      2019-08-05 [?] CRAN (R 3.6.0)
##  P ica                    1.0-2      2018-05-24 [?] CRAN (R 3.6.0)
##  P igraph                 1.2.5      2020-03-19 [?] CRAN (R 3.6.0)
##    IRanges              * 2.20.2     2020-01-13 [1] Bioconductor  
##    irlba                  2.3.3      2019-02-05 [1] CRAN (R 3.6.0)
##  P jsonlite               1.6.1      2020-02-02 [?] CRAN (R 3.6.0)
##  P KernSmooth             2.23-16    2019-10-15 [?] CRAN (R 3.6.2)
##    knitr                  1.28       2020-02-06 [1] CRAN (R 3.6.0)
##  P labeling               0.3        2014-08-23 [?] CRAN (R 3.6.0)
##  P lattice                0.20-40    2020-02-19 [?] CRAN (R 3.6.0)
##  P lazyeval               0.2.2      2019-03-15 [?] CRAN (R 3.6.0)
##  P leiden                 0.3.3      2020-02-04 [?] CRAN (R 3.6.0)
##  P lifecycle              0.2.0      2020-03-06 [?] CRAN (R 3.6.0)
##  P listenv                0.8.0      2019-12-05 [?] CRAN (R 3.6.0)
##  P lmtest                 0.9-37     2019-04-30 [?] CRAN (R 3.6.0)
##  P lsei                   1.2-0      2017-10-23 [?] CRAN (R 3.6.0)
##  P magrittr               1.5        2014-11-22 [?] CRAN (R 3.6.0)
##  P MASS                   7.3-51.5   2019-12-20 [?] CRAN (R 3.6.0)
##  P Matrix                 1.2-18     2019-11-27 [?] CRAN (R 3.6.2)
##    matrixStats          * 0.56.0     2020-03-13 [1] CRAN (R 3.6.0)
##  P metap                  1.3        2020-01-23 [?] CRAN (R 3.6.0)
##  P mnormt                 1.5-6      2020-02-03 [?] CRAN (R 3.6.0)
##  P multcomp               1.4-13     2020-04-08 [?] CRAN (R 3.6.2)
##    multtest               2.42.0     2019-10-29 [1] Bioconductor  
##  P munsell                0.5.0      2018-06-12 [?] CRAN (R 3.6.0)
##  P mutoss                 0.1-12     2017-12-04 [?] CRAN (R 3.6.0)
##  P mvtnorm                1.1-0      2020-02-24 [?] CRAN (R 3.6.0)
##  P nlme                   3.1-142    2019-11-07 [?] CRAN (R 3.6.2)
##  P npsurv                 0.4-0      2017-10-14 [?] CRAN (R 3.6.0)
##  P numDeriv               2016.8-1.1 2019-06-06 [?] CRAN (R 3.6.0)
##  P patchwork              1.0.0      2019-12-01 [?] CRAN (R 3.6.0)
##  P pbapply                1.4-2      2019-08-31 [?] CRAN (R 3.6.0)
##  P pillar                 1.4.3      2019-12-20 [?] CRAN (R 3.6.0)
##  P pkgconfig              2.0.3      2019-09-22 [?] CRAN (R 3.6.0)
##  P plotly                 4.9.2.1    2020-04-04 [?] CRAN (R 3.6.2)
##  P plotrix                3.7-7      2019-12-05 [?] CRAN (R 3.6.0)
##  P plyr                   1.8.6      2020-03-03 [?] CRAN (R 3.6.0)
##  P png                    0.1-7      2013-12-03 [?] CRAN (R 3.6.0)
##  P purrr                  0.3.3      2019-10-18 [?] CRAN (R 3.6.0)
##  P R6                     2.4.1      2019-11-12 [?] CRAN (R 3.6.0)
##  P RANN                   2.6.1      2019-01-08 [?] CRAN (R 3.6.0)
##  P RColorBrewer           1.1-2      2014-12-07 [?] CRAN (R 3.6.0)
##  P Rcpp                   1.0.4.6    2020-04-09 [?] CRAN (R 3.6.2)
##    RcppAnnoy              0.0.16     2020-03-08 [1] CRAN (R 3.6.0)
##    RCurl                  1.98-1.1   2020-01-19 [1] CRAN (R 3.6.0)
##  P Rdpack                 0.11-1     2019-12-14 [?] CRAN (R 3.6.0)
##  P renv                   0.9.3      2020-02-10 [?] CRAN (R 3.6.2)
##  P reshape2               1.4.4      2020-04-09 [?] CRAN (R 3.6.2)
##  P reticulate           * 1.15       2020-04-02 [?] CRAN (R 3.6.2)
##  P rlang                  0.4.5      2020-03-01 [?] CRAN (R 3.6.0)
##    rmarkdown              2.1        2020-01-20 [1] CRAN (R 3.6.0)
##  P rmdformats             0.3.7      2020-03-11 [?] CRAN (R 3.6.0)
##  P ROCR                   1.0-7      2015-03-26 [?] CRAN (R 3.6.0)
##    rsvd                   1.0.3      2020-02-17 [1] CRAN (R 3.6.0)
##  P Rtsne                  0.15       2018-11-10 [?] CRAN (R 3.6.0)
##    S4Vectors            * 0.24.4     2020-04-09 [1] Bioconductor  
##  P sandwich               2.5-1      2019-04-06 [?] CRAN (R 3.6.0)
##  P scales                 1.1.0      2019-11-18 [?] CRAN (R 3.6.0)
##    scater               * 1.14.6     2019-12-16 [1] Bioconductor  
##  P sctransform            0.2.1      2019-12-17 [?] CRAN (R 3.6.0)
##  P sessioninfo            1.1.1      2018-11-05 [?] CRAN (R 3.6.0)
##  P Seurat               * 3.1.4      2020-02-26 [?] CRAN (R 3.6.0)
##    SingleCellExperiment * 1.8.0      2019-10-29 [1] Bioconductor  
##  P sn                     1.6-1      2020-04-01 [?] CRAN (R 3.6.2)
##  P stringi                1.4.6      2020-02-17 [?] CRAN (R 3.6.0)
##    stringr                1.4.0      2019-02-10 [1] CRAN (R 3.6.0)
##    SummarizedExperiment * 1.16.1     2019-12-19 [1] Bioconductor  
##  P survival               3.1-8      2019-12-03 [?] CRAN (R 3.6.2)
##  P TFisher                0.2.0      2018-03-21 [?] CRAN (R 3.6.0)
##  P TH.data                1.0-10     2019-01-21 [?] CRAN (R 3.6.0)
##  P tibble                 3.0.0      2020-03-30 [?] CRAN (R 3.6.2)
##  P tidyr                  1.0.2      2020-01-24 [?] CRAN (R 3.6.0)
##  P tidyselect             1.0.0      2020-01-27 [?] CRAN (R 3.6.0)
##  P tsne                   0.1-3      2016-07-15 [?] CRAN (R 3.6.0)
##  P uwot                   0.1.8      2020-03-16 [?] CRAN (R 3.6.0)
##  P vctrs                  0.2.4      2020-03-10 [?] CRAN (R 3.6.0)
##    vipor                  0.4.5      2017-03-22 [1] CRAN (R 3.6.0)
##    viridis                0.5.1      2018-03-29 [1] CRAN (R 3.6.0)
##  P viridisLite            0.3.0      2018-02-01 [?] CRAN (R 3.6.0)
##  P withr                  2.1.2      2018-03-15 [?] CRAN (R 3.6.0)
##  P xfun                   0.13       2020-04-13 [?] CRAN (R 3.6.2)
##    XVector                0.26.0     2019-10-29 [1] Bioconductor  
##    yaml                   2.2.1      2020-02-01 [1] CRAN (R 3.6.0)
##    zlibbioc               1.32.0     2019-10-29 [1] Bioconductor  
##  P zoo                    1.8-7      2020-01-10 [?] CRAN (R 3.6.0)
## 
## [1] /Users/luke.zappia/Documents/Projects/scanpy-in-R/renv/library/R-3.6/x86_64-apple-darwin15.6.0
## [2] /private/var/folders/rj/60lhr791617422kqvh0r4vy40000gn/T/RtmpvtfkXH/renv-system-library
## 
##  P ── Loaded and on-disk path mismatch.

6.2 R environment

R packages installed in the repository for this tutorial. Note that some of these are only requried to build the HTML output document and are not required to run the code in the tutorial.

Click here

cat(paste(readLines("renv.lock"), collapse = "\n"))
## {
##   "R": {
##     "Version": "3.6.2",
##     "Repositories": [
##       {
##         "Name": "CRAN",
##         "URL": "https://cran.rstudio.com"
##       }
##     ]
##   },
##   "Bioconductor": {
##     "Version": "3.10"
##   },
##   "Python": {
##     "Version": "3.6.10",
##     "Type": "conda",
##     "Name": null
##   },
##   "Packages": {
##     "BH": {
##       "Package": "BH",
##       "Version": "1.72.0-3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "8f9ce74c6417d61f0782cbae5fd2b7b0"
##     },
##     "Biobase": {
##       "Package": "Biobase",
##       "Version": "2.46.0",
##       "Source": "Bioconductor",
##       "Hash": "ddbfe185296ede75aadb84a51724ac88"
##     },
##     "BiocGenerics": {
##       "Package": "BiocGenerics",
##       "Version": "0.32.0",
##       "Source": "Bioconductor",
##       "Hash": "b2dabf833cc349c2cd9cba38de7af085"
##     },
##     "BiocManager": {
##       "Package": "BiocManager",
##       "Version": "1.30.10",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "db75371846625725e221470b310da1d5"
##     },
##     "BiocNeighbors": {
##       "Package": "BiocNeighbors",
##       "Version": "1.4.2",
##       "Source": "Bioconductor",
##       "Hash": "7efabfe65f1a19d9393a18165291da4d"
##     },
##     "BiocParallel": {
##       "Package": "BiocParallel",
##       "Version": "1.20.1",
##       "Source": "Bioconductor",
##       "Hash": "744ce1b8f59ad5827fe03f30a4fe8e50"
##     },
##     "BiocSingular": {
##       "Package": "BiocSingular",
##       "Version": "1.2.2",
##       "Source": "Bioconductor",
##       "Hash": "f7ddc50823c540769c5e09b6680fcbc8"
##     },
##     "BiocVersion": {
##       "Package": "BiocVersion",
##       "Version": "3.10.1",
##       "Source": "Bioconductor",
##       "Hash": "b69e4e634db423b8e6c58103d579ec95"
##     },
##     "DelayedArray": {
##       "Package": "DelayedArray",
##       "Version": "0.12.3",
##       "Source": "Bioconductor",
##       "Hash": "b6d613d1e53206ce39aa7a27a1704486"
##     },
##     "DelayedMatrixStats": {
##       "Package": "DelayedMatrixStats",
##       "Version": "1.8.0",
##       "Source": "Bioconductor",
##       "Hash": "1071302d3371eb4170b03b9ebf66760a"
##     },
##     "FNN": {
##       "Package": "FNN",
##       "Version": "1.1.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b56998fff55e4a4b4860ad6e8c67e0f9"
##     },
##     "GenomeInfoDb": {
##       "Package": "GenomeInfoDb",
##       "Version": "1.22.1",
##       "Source": "Bioconductor",
##       "Hash": "df46d6ce62f1e897fecbfc5e847d823c"
##     },
##     "GenomeInfoDbData": {
##       "Package": "GenomeInfoDbData",
##       "Version": "1.2.2",
##       "Source": "Bioconductor",
##       "Hash": "de42132c04371f624cdea8de86e8fc5d"
##     },
##     "GenomicRanges": {
##       "Package": "GenomicRanges",
##       "Version": "1.38.0",
##       "Source": "Bioconductor",
##       "Hash": "8ff54983afa8eda100fa0fcadd6816bf"
##     },
##     "HDF5Array": {
##       "Package": "HDF5Array",
##       "Version": "1.14.4",
##       "Source": "Bioconductor",
##       "Hash": "95944feb6cff540c92031a09309f3bef"
##     },
##     "IRanges": {
##       "Package": "IRanges",
##       "Version": "2.20.2",
##       "Source": "Bioconductor",
##       "Hash": "148fe882b25f679b03afc45da15e760c"
##     },
##     "KernSmooth": {
##       "Package": "KernSmooth",
##       "Version": "2.23-16",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "997471f25a7ed6c782f0090ce52cc63a"
##     },
##     "MASS": {
##       "Package": "MASS",
##       "Version": "7.3-51.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "9efe80472b21189ebab1b74169808c26"
##     },
##     "Matrix": {
##       "Package": "Matrix",
##       "Version": "1.2-18",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "08588806cba69f04797dab50627428ed"
##     },
##     "MatrixModels": {
##       "Package": "MatrixModels",
##       "Version": "0.4-1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "d57ac35220b39c591388ab3a080f9cbe"
##     },
##     "R6": {
##       "Package": "R6",
##       "Version": "2.4.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "292b54f8f4b94669b08f94e5acce6be2"
##     },
##     "RANN": {
##       "Package": "RANN",
##       "Version": "2.6.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "d128ea05a972d3e67c6f39de52c72bd7"
##     },
##     "RColorBrewer": {
##       "Package": "RColorBrewer",
##       "Version": "1.1-2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e031418365a7f7a766181ab5a41a5716"
##     },
##     "RCurl": {
##       "Package": "RCurl",
##       "Version": "1.98-1.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "26b1263f36bd66a9e8b5c80753ebedea"
##     },
##     "ROCR": {
##       "Package": "ROCR",
##       "Version": "1.0-7",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "fd202bb77d2b1b19fb9dcc393d489ef0"
##     },
##     "RSpectra": {
##       "Package": "RSpectra",
##       "Version": "0.16-0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "a41329d24d5a98eaed2bd0159adb1b5f"
##     },
##     "Rcpp": {
##       "Package": "Rcpp",
##       "Version": "1.0.4.6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e652f23d8b1807cc975c51410d05b72f"
##     },
##     "RcppAnnoy": {
##       "Package": "RcppAnnoy",
##       "Version": "0.0.16",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "076352082c0cd6e24e87649d4e656e2f"
##     },
##     "RcppEigen": {
##       "Package": "RcppEigen",
##       "Version": "0.3.3.7.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "c6faf038ba4346b1de19ad7c99b8f94a"
##     },
##     "RcppHNSW": {
##       "Package": "RcppHNSW",
##       "Version": "0.2.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "3224f3204b7a8be299b3f939c07025ad"
##     },
##     "RcppProgress": {
##       "Package": "RcppProgress",
##       "Version": "0.4.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "1c0aa18b97e6aaa17f93b8b866c0ace5"
##     },
##     "Rdpack": {
##       "Package": "Rdpack",
##       "Version": "0.11-1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "41999a971efe596c3715f2601030cd79"
##     },
##     "Rhdf5lib": {
##       "Package": "Rhdf5lib",
##       "Version": "1.8.0",
##       "Source": "Bioconductor",
##       "Hash": "4a3bef5117511bfc1a0b23fddd7585ef"
##     },
##     "Rtsne": {
##       "Package": "Rtsne",
##       "Version": "0.15",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "f153432c4ca15b937ccfaa40f167c892"
##     },
##     "S4Vectors": {
##       "Package": "S4Vectors",
##       "Version": "0.24.4",
##       "Source": "Bioconductor",
##       "Hash": "e338665aea0ba0bbf7615d318b2eccee"
##     },
##     "Seurat": {
##       "Package": "Seurat",
##       "Version": "3.1.4",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "687418116139a0eddade5f43aa85db2f"
##     },
##     "SingleCellExperiment": {
##       "Package": "SingleCellExperiment",
##       "Version": "1.8.0",
##       "Source": "Bioconductor",
##       "Hash": "cfacead44b3a501a8d782af94cc7e2c9"
##     },
##     "SparseM": {
##       "Package": "SparseM",
##       "Version": "1.78",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "fbe4ac267bf42a91e495cc68ad3f8b63"
##     },
##     "SummarizedExperiment": {
##       "Package": "SummarizedExperiment",
##       "Version": "1.16.1",
##       "Source": "Bioconductor",
##       "Hash": "1f4c0859b8f338bd9f8c0b7967e719a3"
##     },
##     "TFisher": {
##       "Package": "TFisher",
##       "Version": "0.2.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e6b216a490aaae020d2ac09e1e0988b5"
##     },
##     "TH.data": {
##       "Package": "TH.data",
##       "Version": "1.0-10",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "84dffc44f23c419537c1c79cc46347a5"
##     },
##     "XVector": {
##       "Package": "XVector",
##       "Version": "0.26.0",
##       "Source": "Bioconductor",
##       "Hash": "b72b7c53049b71fbfd0792fb7ec66987"
##     },
##     "ape": {
##       "Package": "ape",
##       "Version": "5.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "35b0c2165569c94550d5e28b5a792b2f"
##     },
##     "askpass": {
##       "Package": "askpass",
##       "Version": "1.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e8a22846fff485f0be3770c2da758713"
##     },
##     "assertthat": {
##       "Package": "assertthat",
##       "Version": "0.2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "50c838a310445e954bc13f26f26a6ecf"
##     },
##     "backports": {
##       "Package": "backports",
##       "Version": "1.1.6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "3997fd62345a616e59e8161ee0a5816f"
##     },
##     "base64enc": {
##       "Package": "base64enc",
##       "Version": "0.1-3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "543776ae6848fde2f48ff3816d0628bc"
##     },
##     "beachmat": {
##       "Package": "beachmat",
##       "Version": "2.2.1",
##       "Source": "Bioconductor",
##       "Hash": "13b4829abeb942aea40478bf235c4e0b"
##     },
##     "beeswarm": {
##       "Package": "beeswarm",
##       "Version": "0.2.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "dc538ec663e38888807ef3034489403d"
##     },
##     "bibtex": {
##       "Package": "bibtex",
##       "Version": "0.4.2.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "8d96f3da9e7ec851e14e39c0872ad1ab"
##     },
##     "bitops": {
##       "Package": "bitops",
##       "Version": "1.0-6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0b118d5900596bae6c4d4865374536a6"
##     },
##     "bookdown": {
##       "Package": "bookdown",
##       "Version": "0.18",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "72e9c52caf3f7aacb4e368b75f6ec72a"
##     },
##     "caTools": {
##       "Package": "caTools",
##       "Version": "1.18.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6f7c1405e500ef25a7c147e860b5fe32"
##     },
##     "callr": {
##       "Package": "callr",
##       "Version": "3.4.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "643163a00cb536454c624883a10ae0bc"
##     },
##     "cli": {
##       "Package": "cli",
##       "Version": "2.0.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ff0becff7bfdfe3f75d29aff8f3172dd"
##     },
##     "cluster": {
##       "Package": "cluster",
##       "Version": "2.1.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "db63a44aab5aadcb6bf2f129751d129a"
##     },
##     "codetools": {
##       "Package": "codetools",
##       "Version": "0.2-16",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "89cf4b8207269ccf82fbeb6473fd662b"
##     },
##     "colorspace": {
##       "Package": "colorspace",
##       "Version": "1.4-1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6b436e95723d1f0e861224dd9b094dfb"
##     },
##     "cowplot": {
##       "Package": "cowplot",
##       "Version": "1.0.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "82bae0172ae9d4c4f88a440ad01f73bb"
##     },
##     "crayon": {
##       "Package": "crayon",
##       "Version": "1.3.4",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0d57bc8e27b7ba9e45dba825ebc0de6b"
##     },
##     "crosstalk": {
##       "Package": "crosstalk",
##       "Version": "1.1.0.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ae55f5d7c02f0ab43c58dd050694f2b4"
##     },
##     "curl": {
##       "Package": "curl",
##       "Version": "4.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "2b7d10581cc730804e9ed178c8374bd6"
##     },
##     "data.table": {
##       "Package": "data.table",
##       "Version": "1.12.8",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "cd711af60c47207a776213a368626369"
##     },
##     "desc": {
##       "Package": "desc",
##       "Version": "1.2.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6c8fe8fa26a23b79949375d372c7b395"
##     },
##     "digest": {
##       "Package": "digest",
##       "Version": "0.6.25",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "f697db7d92b7028c4b3436e9603fb636"
##     },
##     "dplyr": {
##       "Package": "dplyr",
##       "Version": "0.8.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "57a42ddf80f429764ff7987128c3fd0a"
##     },
##     "dqrng": {
##       "Package": "dqrng",
##       "Version": "0.2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "cc0d03e8383d407e9568855f8efbc07d"
##     },
##     "ellipsis": {
##       "Package": "ellipsis",
##       "Version": "0.3.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "7067d90c1c780bfe80c0d497e3d7b49d"
##     },
##     "evaluate": {
##       "Package": "evaluate",
##       "Version": "0.14",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ec8ca05cffcc70569eaaad8469d2a3a7"
##     },
##     "fansi": {
##       "Package": "fansi",
##       "Version": "0.4.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "7fce217eaaf8016e72065e85c73027b5"
##     },
##     "farver": {
##       "Package": "farver",
##       "Version": "2.0.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "dad6793a5a1f73c8e91f1a1e3e834b05"
##     },
##     "fitdistrplus": {
##       "Package": "fitdistrplus",
##       "Version": "1.0-14",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "690f753a275a336022edcffcec5f9aea"
##     },
##     "formatR": {
##       "Package": "formatR",
##       "Version": "1.7",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ad36e26eeeb7393886d8a0e19bc6ee42"
##     },
##     "futile.logger": {
##       "Package": "futile.logger",
##       "Version": "1.4.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "99f0ace8c05ec7d3683d27083c4f1e7e"
##     },
##     "futile.options": {
##       "Package": "futile.options",
##       "Version": "1.0.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0d9bf02413ddc2bbe8da9ce369dcdd2b"
##     },
##     "future": {
##       "Package": "future",
##       "Version": "1.16.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "20c20385da360f28c07364f2d099a6d7"
##     },
##     "future.apply": {
##       "Package": "future.apply",
##       "Version": "1.4.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "a690d4bb5e287dc499229617a944dc39"
##     },
##     "gbRd": {
##       "Package": "gbRd",
##       "Version": "0.4-11",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "dd324973735626ce23e950a5f2d3d8ee"
##     },
##     "gdata": {
##       "Package": "gdata",
##       "Version": "2.18.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "465ccb84427f5fe2c54f8620666db131"
##     },
##     "ggbeeswarm": {
##       "Package": "ggbeeswarm",
##       "Version": "0.6.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "dd68b9b215b2d3119603549a794003c3"
##     },
##     "ggplot2": {
##       "Package": "ggplot2",
##       "Version": "3.3.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "911561e07da928345f1ae2d69f97f3ea"
##     },
##     "ggrepel": {
##       "Package": "ggrepel",
##       "Version": "0.8.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "c013a50b19695daf04853679e1bc105a"
##     },
##     "ggridges": {
##       "Package": "ggridges",
##       "Version": "0.5.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b5c4e55a3856dff3c05595630a40edfc"
##     },
##     "globals": {
##       "Package": "globals",
##       "Version": "0.12.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e9e529fb7a579ad4b4ff65e052e76ed8"
##     },
##     "glue": {
##       "Package": "glue",
##       "Version": "1.4.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "2aefa994e8df5da17dc09afd80f924d5"
##     },
##     "gplots": {
##       "Package": "gplots",
##       "Version": "3.0.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "8c9dd0fe4766504762688b9f1de3139e"
##     },
##     "gridExtra": {
##       "Package": "gridExtra",
##       "Version": "2.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "7d7f283939f563670a697165b2cf5560"
##     },
##     "gtable": {
##       "Package": "gtable",
##       "Version": "0.3.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ac5c6baf7822ce8732b343f14c072c4d"
##     },
##     "gtools": {
##       "Package": "gtools",
##       "Version": "3.8.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0a749b4458d19a54acae93c64e3e7c85"
##     },
##     "hexbin": {
##       "Package": "hexbin",
##       "Version": "1.28.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "3d59212f2814d65dff517e6899813c58"
##     },
##     "highr": {
##       "Package": "highr",
##       "Version": "0.8",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "4dc5bb88961e347a0f4d8aad597cbfac"
##     },
##     "htmltools": {
##       "Package": "htmltools",
##       "Version": "0.4.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "2d7691222f82f41e93f6d30f169bd5e1"
##     },
##     "htmlwidgets": {
##       "Package": "htmlwidgets",
##       "Version": "1.5.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "41bace23583fbc25089edae324de2dc3"
##     },
##     "httr": {
##       "Package": "httr",
##       "Version": "1.4.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "7146fea4685b4252ebf478978c75f597"
##     },
##     "ica": {
##       "Package": "ica",
##       "Version": "1.0-2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "95ba9b882bb834ecbdad37338a11f3f8"
##     },
##     "igraph": {
##       "Package": "igraph",
##       "Version": "1.2.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "3878c30ce67cdb7f2d7f72554e37f476"
##     },
##     "irlba": {
##       "Package": "irlba",
##       "Version": "2.3.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "a9ad517358000d57022401ef18ee657a"
##     },
##     "isoband": {
##       "Package": "isoband",
##       "Version": "0.2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "9b2f7cf1899f583a36d367702ecf49a3"
##     },
##     "jsonlite": {
##       "Package": "jsonlite",
##       "Version": "1.6.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "84b0ee361e2f78d6b7d670db9471c0c5"
##     },
##     "knitr": {
##       "Package": "knitr",
##       "Version": "1.28",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "915a6f0134cdbdf016d7778bc80b2eda"
##     },
##     "labeling": {
##       "Package": "labeling",
##       "Version": "0.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "73832978c1de350df58108c745ed0e3e"
##     },
##     "lambda.r": {
##       "Package": "lambda.r",
##       "Version": "1.2.4",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b1e925c4b9ffeb901bacf812cbe9a6ad"
##     },
##     "later": {
##       "Package": "later",
##       "Version": "1.0.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6d927978fc658d24175ce37db635f9e5"
##     },
##     "lattice": {
##       "Package": "lattice",
##       "Version": "0.20-40",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "61339152c288b871facca5f68f401f89"
##     },
##     "lazyeval": {
##       "Package": "lazyeval",
##       "Version": "0.2.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "d908914ae53b04d4c0c0fd72ecc35370"
##     },
##     "leiden": {
##       "Package": "leiden",
##       "Version": "0.3.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b558ae02ba3ad5a3f015de3e8208c0a4"
##     },
##     "lifecycle": {
##       "Package": "lifecycle",
##       "Version": "0.2.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "361811f31f71f8a617a9a68bf63f1f42"
##     },
##     "listenv": {
##       "Package": "listenv",
##       "Version": "0.8.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0bde42ee282efb18c7c4e63822f5b4f7"
##     },
##     "lmtest": {
##       "Package": "lmtest",
##       "Version": "0.9-37",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "c108129ded5ffdb129064ec1d7ba77d0"
##     },
##     "lsei": {
##       "Package": "lsei",
##       "Version": "1.2-0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "75f28bb3d161432f11a63a7a56b1ffdc"
##     },
##     "magrittr": {
##       "Package": "magrittr",
##       "Version": "1.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "1bb58822a20301cee84a41678e25d9b7"
##     },
##     "markdown": {
##       "Package": "markdown",
##       "Version": "1.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "61e4a10781dd00d7d81dd06ca9b94e95"
##     },
##     "matrixStats": {
##       "Package": "matrixStats",
##       "Version": "0.56.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "d16f18aeb023d7a80c090d9458fc75a6"
##     },
##     "metap": {
##       "Package": "metap",
##       "Version": "1.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "618d4f26eaf3cde5b5bb7c40387154e3"
##     },
##     "mgcv": {
##       "Package": "mgcv",
##       "Version": "1.8-31",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "4bb7e0c4f3557583e1e8d3c9ffb8ba5c"
##     },
##     "mime": {
##       "Package": "mime",
##       "Version": "0.9",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e87a35ec73b157552814869f45a63aa3"
##     },
##     "mnormt": {
##       "Package": "mnormt",
##       "Version": "1.5-6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "f4c908c3d498f2ed076cb1746dc8b0db"
##     },
##     "multcomp": {
##       "Package": "multcomp",
##       "Version": "1.4-13",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b3a36caf2e30d4551a0b7dce274057bb"
##     },
##     "multtest": {
##       "Package": "multtest",
##       "Version": "2.42.0",
##       "Source": "Bioconductor",
##       "Hash": "8dbb186639bbb7580d90f44a1776639f"
##     },
##     "munsell": {
##       "Package": "munsell",
##       "Version": "0.5.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6dfe8bf774944bd5595785e3229d8771"
##     },
##     "mutoss": {
##       "Package": "mutoss",
##       "Version": "0.1-12",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0aa141265a2f405ac251e8fb58c0971b"
##     },
##     "mvtnorm": {
##       "Package": "mvtnorm",
##       "Version": "1.1-0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b4467e29ec60b2d05e361c9141e4fc59"
##     },
##     "nlme": {
##       "Package": "nlme",
##       "Version": "3.1-142",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "557d78d7eac2c1090ee58647a6274142"
##     },
##     "npsurv": {
##       "Package": "npsurv",
##       "Version": "0.4-0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "63576bc6d9730443164d9108c7c05044"
##     },
##     "numDeriv": {
##       "Package": "numDeriv",
##       "Version": "2016.8-1.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "df58958f293b166e4ab885ebcad90e02"
##     },
##     "openssl": {
##       "Package": "openssl",
##       "Version": "1.4.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "49f7258fd86ebeaea1df24d9ded00478"
##     },
##     "patchwork": {
##       "Package": "patchwork",
##       "Version": "1.0.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "16eee5b5edc41eec5af1149ccdc6b2c9"
##     },
##     "pbapply": {
##       "Package": "pbapply",
##       "Version": "1.4-2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ee90507ce37987b22470fae76325f370"
##     },
##     "pillar": {
##       "Package": "pillar",
##       "Version": "1.4.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "fa3ed60396b6998d0427c57dab90fba4"
##     },
##     "pkgbuild": {
##       "Package": "pkgbuild",
##       "Version": "1.0.6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "899835dfe286963471cbdb9591f8f94f"
##     },
##     "pkgconfig": {
##       "Package": "pkgconfig",
##       "Version": "2.0.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "01f28d4278f15c76cddbea05899c5d6f"
##     },
##     "pkgload": {
##       "Package": "pkgload",
##       "Version": "1.0.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "5e655fb54cceead0f095f22d7be33da3"
##     },
##     "plogr": {
##       "Package": "plogr",
##       "Version": "0.2.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "09eb987710984fc2905c7129c7d85e65"
##     },
##     "plotly": {
##       "Package": "plotly",
##       "Version": "4.9.2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "b08edf378e0e38959a6983e3d5902795"
##     },
##     "plotrix": {
##       "Package": "plotrix",
##       "Version": "3.7-7",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "f273659b57b53ead904028360b93ba68"
##     },
##     "plyr": {
##       "Package": "plyr",
##       "Version": "1.8.6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ec0e5ab4e5f851f6ef32cd1d1984957f"
##     },
##     "png": {
##       "Package": "png",
##       "Version": "0.1-7",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "03b7076c234cb3331288919983326c55"
##     },
##     "praise": {
##       "Package": "praise",
##       "Version": "1.0.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "a555924add98c99d2f411e37e7d25e9f"
##     },
##     "prettyunits": {
##       "Package": "prettyunits",
##       "Version": "1.1.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "95ef9167b75dde9d2ccc3c7528393e7e"
##     },
##     "processx": {
##       "Package": "processx",
##       "Version": "3.4.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "20a082f2bde0ffcd8755779fd476a274"
##     },
##     "promises": {
##       "Package": "promises",
##       "Version": "1.1.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "efbbe62da4709f7040a380c702bc7103"
##     },
##     "ps": {
##       "Package": "ps",
##       "Version": "1.3.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "98777535b61c57d1749344345e2a4ccd"
##     },
##     "purrr": {
##       "Package": "purrr",
##       "Version": "0.3.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "22aca7d1181718e927d403a8c2d69d62"
##     },
##     "quantreg": {
##       "Package": "quantreg",
##       "Version": "5.55",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "dc0f41e5f60efc5fdbdb35a51a4028c5"
##     },
##     "rappdirs": {
##       "Package": "rappdirs",
##       "Version": "0.3.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "8c8298583adbbe76f3c2220eef71bebc"
##     },
##     "renv": {
##       "Package": "renv",
##       "Version": "0.9.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "c1a367437d8a8a44bec4b9d4974cb20c"
##     },
##     "reshape2": {
##       "Package": "reshape2",
##       "Version": "1.4.4",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "bb5996d0bd962d214a11140d77589917"
##     },
##     "reticulate": {
##       "Package": "reticulate",
##       "Version": "1.15",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ba447f1ad910156609e8e37b52e752e3"
##     },
##     "rhdf5": {
##       "Package": "rhdf5",
##       "Version": "2.30.1",
##       "Source": "Bioconductor",
##       "Hash": "413d578e76ee631eaf479d9b98841bf8"
##     },
##     "rlang": {
##       "Package": "rlang",
##       "Version": "0.4.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "1cc1b38e4db40ea6eb19ab8080bbed3b"
##     },
##     "rmarkdown": {
##       "Package": "rmarkdown",
##       "Version": "2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "9d1c61d476c448350c482d6664e1b28b"
##     },
##     "rmdformats": {
##       "Package": "rmdformats",
##       "Version": "0.3.7",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "8bfe9a47bab2fd83f6efd1faeed28034"
##     },
##     "rprojroot": {
##       "Package": "rprojroot",
##       "Version": "1.3-2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "f6a407ae5dd21f6f80a6708bbb6eb3ae"
##     },
##     "rstudioapi": {
##       "Package": "rstudioapi",
##       "Version": "0.11",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "33a5b27a03da82ac4b1d43268f80088a"
##     },
##     "rsvd": {
##       "Package": "rsvd",
##       "Version": "1.0.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "3a6b30449282b6a4b19ce267142c3299"
##     },
##     "sandwich": {
##       "Package": "sandwich",
##       "Version": "2.5-1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "510d1f864cd565d8119801a49db4fd85"
##     },
##     "scales": {
##       "Package": "scales",
##       "Version": "1.1.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "a1c68369c629ea3188d0676e37069c65"
##     },
##     "scater": {
##       "Package": "scater",
##       "Version": "1.14.6",
##       "Source": "Bioconductor",
##       "Hash": "20ff4807d30e7dfa01912a3396d71981"
##     },
##     "sctransform": {
##       "Package": "sctransform",
##       "Version": "0.2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "61f43457038016e2aa1f0fce3867718f"
##     },
##     "sessioninfo": {
##       "Package": "sessioninfo",
##       "Version": "1.1.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "308013098befe37484df72c39cf90d6e"
##     },
##     "sitmo": {
##       "Package": "sitmo",
##       "Version": "2.0.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0f9ba299f2385e686745b066c6d7a7c4"
##     },
##     "sn": {
##       "Package": "sn",
##       "Version": "1.6-1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "79ba68cf0b686c9f7d24825cd5a8493e"
##     },
##     "snow": {
##       "Package": "snow",
##       "Version": "0.4-3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "11b822ad6214111a4188d5e5fd1b144c"
##     },
##     "stringi": {
##       "Package": "stringi",
##       "Version": "1.4.6",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e99d8d656980d2dd416a962ae55aec90"
##     },
##     "stringr": {
##       "Package": "stringr",
##       "Version": "1.4.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0759e6b6c0957edb1311028a49a35e76"
##     },
##     "survival": {
##       "Package": "survival",
##       "Version": "3.1-8",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ad25122f95d04988f6f79d69aaadd53d"
##     },
##     "sys": {
##       "Package": "sys",
##       "Version": "3.3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "507f3116a38d37ad330a038b3be07b66"
##     },
##     "testthat": {
##       "Package": "testthat",
##       "Version": "2.3.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "0829b987b8961fb07f3b1b64a2fbc495"
##     },
##     "tibble": {
##       "Package": "tibble",
##       "Version": "3.0.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "e742bc8d72071ef9aba29f71f132d773"
##     },
##     "tidyr": {
##       "Package": "tidyr",
##       "Version": "1.0.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "fb73a010ace00d6c584c2b53a21b969c"
##     },
##     "tidyselect": {
##       "Package": "tidyselect",
##       "Version": "1.0.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "7d4b0f1ab542d8cb7a40c593a4de2f36"
##     },
##     "tinytex": {
##       "Package": "tinytex",
##       "Version": "0.21",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "02e11a2e5d05f1d5ab19394f19ab2999"
##     },
##     "tsne": {
##       "Package": "tsne",
##       "Version": "0.1-3",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "7a6f77f5bdfa8a876f4995b8accfa68b"
##     },
##     "utf8": {
##       "Package": "utf8",
##       "Version": "1.1.4",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "4a5081acfb7b81a572e4384a7aaf2af1"
##     },
##     "uwot": {
##       "Package": "uwot",
##       "Version": "0.1.8",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "094c1c4b1dad5a5aa84adafe5cd6d076"
##     },
##     "vctrs": {
##       "Package": "vctrs",
##       "Version": "0.2.4",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6c839a149a30cb4ffc70443efa74c197"
##     },
##     "vipor": {
##       "Package": "vipor",
##       "Version": "0.4.5",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ea85683da7f2bfa63a98dc6416892591"
##     },
##     "viridis": {
##       "Package": "viridis",
##       "Version": "0.5.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "6f6b49e5b3b5ee5a6d0c28bf1b4b9eb3"
##     },
##     "viridisLite": {
##       "Package": "viridisLite",
##       "Version": "0.3.0",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "ce4f6271baa94776db692f1cb2055bee"
##     },
##     "withr": {
##       "Package": "withr",
##       "Version": "2.1.2",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "aa57ed55ff2df4bea697a07df528993d"
##     },
##     "xfun": {
##       "Package": "xfun",
##       "Version": "0.13",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "3c1eeacd705ff1695db94bfd443b8a84"
##     },
##     "yaml": {
##       "Package": "yaml",
##       "Version": "2.2.1",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "2826c5d9efb0a88f657c7a679c7106db"
##     },
##     "zlibbioc": {
##       "Package": "zlibbioc",
##       "Version": "1.32.0",
##       "Source": "Bioconductor",
##       "Hash": "f7a31247eadfb45098bcf2e8c4aebb49"
##     },
##     "zoo": {
##       "Package": "zoo",
##       "Version": "1.8-7",
##       "Source": "Repository",
##       "Repository": "CRAN",
##       "Hash": "157e0e442de69a5b00ee5c7066d6184d"
##     }
##   }
## }

6.3 Python environment

Python packages installed in the repository for this tutorial.

Click here

cat(paste(readLines("environment.yml"), collapse = "\n"))
## name: null
## channels:
##   - conda-forge
##   - bioconda
##   - defaults
## dependencies:
##   - anndata=0.7.1=py36_0
##   - blosc=1.18.1=h4a8c4bd_0
##   - bzip2=1.0.8=h0b31af3_2
##   - ca-certificates=2020.4.5.1=hecc5488_0
##   - cairo=1.16.0=hec6a9b0_1003
##   - certifi=2020.4.5.1=py36h9f0ad1d_0
##   - cycler=0.10.0=py_2
##   - decorator=4.4.2=py_0
##   - fontconfig=2.13.1=h6b1039f_1001
##   - freetype=2.10.1=h8da9a1a_0
##   - get_version=2.1=py_1
##   - gettext=0.19.8.1=h46ab8bc_1002
##   - glib=2.58.3=py36hb0ce7ff_1004
##   - gmp=6.2.0=h4a8c4bd_2
##   - h5py=2.10.0=nompi_py36h106b333_102
##   - hdf5=1.10.5=nompi_h3e39495_1104
##   - icu=64.2=h6de7cb9_1
##   - igraph=0.8.0=h91b20c2_0
##   - importlib-metadata=1.6.0=py36h9f0ad1d_0
##   - importlib_metadata=1.6.0=0
##   - joblib=0.14.1=py_0
##   - kiwisolver=1.2.0=py36h863e41a_0
##   - legacy-api-wrap=1.2=py_0
##   - libblas=3.8.0=16_openblas
##   - libcblas=3.8.0=16_openblas
##   - libcxx=10.0.0=0
##   - libffi=3.2.1=h4a8c4bd_1007
##   - libgfortran=4.0.0=2
##   - libiconv=1.15=h0b31af3_1006
##   - liblapack=3.8.0=16_openblas
##   - libllvm8=8.0.1=h770b8ee_0
##   - libopenblas=0.3.9=h3d69b6c_0
##   - libpng=1.6.37=hbbe82c9_1
##   - libxml2=2.9.10=h53d96d6_0
##   - llvm-openmp=10.0.0=h28b9765_0
##   - llvmlite=0.31.0=py36hde82470_1
##   - louvain=0.6.1=py36hfc679d8_1
##   - matplotlib-base=3.2.1=py36h83d3ec1_0
##   - mock=3.0.5=py36h9f0ad1d_1
##   - natsort=7.0.1=py_0
##   - ncurses=6.1=h0a44026_1002
##   - networkx=2.4=py_1
##   - numba=0.48.0=py36h4f17bb1_0
##   - numexpr=2.7.1=py36hcc1bba6_1
##   - numpy=1.18.1=py36hdc5ca10_1
##   - openssl=1.1.1f=h0b31af3_0
##   - packaging=20.1=py_0
##   - pandas=1.0.3=py36hcc1bba6_0
##   - patsy=0.5.1=py_0
##   - pcre=8.44=h4a8c4bd_0
##   - pip=20.0.2=py_2
##   - pixman=0.38.0=h01d97ff_1003
##   - pycairo=1.19.1=py36h1ef2672_3
##   - pyparsing=2.4.7=pyh9f0ad1d_0
##   - pytables=3.6.1=py36h6f8395a_1
##   - python=3.6.10=h4334963_1010_cpython
##   - python-dateutil=2.8.1=py_0
##   - python-igraph=0.8.0=py36hffd003b_1
##   - python_abi=3.6=1_cp36m
##   - pytz=2019.3=py_0
##   - readline=8.0=hcfe32e1_0
##   - scanpy=1.4.6=py_0
##   - scikit-learn=0.22.2.post1=py36h3dc85bc_0
##   - scipy=1.4.1=py36h1dac7e4_3
##   - seaborn=0.10.0=py_1
##   - setuptools=46.1.3=py36h9f0ad1d_0
##   - setuptools-scm=3.5.0=py_1
##   - setuptools_scm=3.5.0=1
##   - six=1.14.0=py_1
##   - sqlite=3.30.1=h93121df_0
##   - statsmodels=0.11.1=py36h37b9a7d_1
##   - texttable=1.6.2=py_0
##   - tk=8.6.10=hbbe82c9_0
##   - tornado=6.0.4=py36h37b9a7d_1
##   - tqdm=4.45.0=pyh9f0ad1d_0
##   - umap-learn=0.4.1=py36h9f0ad1d_0
##   - wheel=0.34.2=py_1
##   - xz=5.2.5=h0b31af3_0
##   - zipp=3.1.0=py_0
##   - zlib=1.2.11=h0b31af3_1006
## prefix: /Users/luke.zappia/Documents/Projects/scanpy-in-R/renv/python/condaenvs/renv-python