Run Seurat (an R Package) in a notebook interface on a server without root
After a while of playing around, I’ll say the best way to use R with a Notebook-style interface on a server where you are no superuser would be using Anaconda, and then run R inside Anaconda to get whatever package you need. It is designed to run for a normal user, so there’s no need for superuser permission, and dependency issue is also taken care of most of the time.
If you get the permission on server and are comfortable with R Studio, R
Studio Server might be a even better option. That is because even if the
packages are in
Bioconda, sometimes they are out of date,
which might break dependencies, and
conda skeleton and
unfortunately come with a lot of dependency issue as well. Besides, the
visualization of environment and integration of documentation is better
in R Studio for me.
What worked for me starts from creating a new environment in Anaconda
and install the
r-essentials, which should provide a platform ready
conda create --name R conda install -c r r-essentials
One thing to be noted is that sometimes the packages on Conda are not
up-to-date, and that would create some version issue for the R packages,
so you might check on different channels to see if there’s something you
need with version number in mind. It might be simpler to just use
install.packages()in the R environment directly though.
R seemed not to know where to find the libraries installed by Conda, and
it turned out I also needed to
export LD_LIBRARY_PATH=[Conda lib path for the virtual environment] to let the compiler function properly.
Even with the path set,
igraph failed its compilation in R console,
conda install -c r r-igraph fixed that.
After that, I am finally good to go with Jupyter Notebook running R.
The takehome message for me is that it could be complicated to install
required libraries to user directory, and the dependencies for these are
often too long to be manually managed. I found out I needed
install something, but when I tried to install
cmake from source, it
warned me that a compiler supporting C++11 was not found, and then I
tried to get new version of
gcc but the configure file of
still could not find that copy of
I spent almost 3 days in this maze of dependencies, and though I felt I learned a lot, I was not able to fix things this way. Anyway, I guess that why we need package management. You could find other unsuccessful attempts below if you are interersted.
Attempt 1: Setting up Rkernal with IPython Notebook in Anaconda
Anaconda keeps an independent copy of R when it is installed with
conda install -c r r-essentials. I wanted to install the latest version
the conda version of
Seurat, so I googled for how
to install packages from CRAN in Conda and find
According to the thread, I tried to do something like
install.packages(“Seurat”, lib = [conda R path]) from my user copy
There is actually a great reason against this
install.packages()decides whether to install
dependencies based on the installed ones, so if you run
install.packages() from another copy of R, the dependency would be a
I tried to use the Conda copy of R, and do
install.packages(“Seurat”) , and found out…
ERROR: dependencies ‘igraph’, ‘diffusionMap’ are not available for package ‘Seurat’ * removing ‘[My Conda path]/R/library/Seurat’
It turned out
igraph was not compiled successfully and seems to be a
result of system library dependency issue according to
and I would need
libssh2–1-dev, and I gave up here because I saw a labyrinth of
Attempt 2: Install Rstudio Server without root
If I could do it, I would be able to use the user copy of R, which I am
okay with, and I like R Studio quite a lot. Long story short.
Installation is possible, but execution is not. Basically you could
follow the official instruction, and finish with
make install prefix=[somewhere you can write]. Nonetheless, starting a server
unsurprisingly requires you to be root.
One additional hilarious thing here is that we did not have
that server, and when I tried to install a copy, it failed because no
C++ compiler supporting C++11 is available (though
a nice one.) Until I am done through all these, I noticed that there was
already a copy of rstudio-server on the machine I used.
Attempt 3: Make Jupyter Notebook use my user copy of R
I entered R console, and tried
devtools::install_github(“IRkernel/IRkernel”). Guess what, it failed
with an error message of:
Installation failed: An unknown option was passed in to libcurl.
Alas. A bit troubleshooting indicated that I might have some version issue for libcurl, but I don’t know which.
Alternatively, I tried to use
should serve the same function as
IRkernel, but it also has its
dependency issue: it requires
gdtools, which won’t compile without
pixman. I tried to install from
./configure && make && make install prefix=$HOME/.local/bin, but
complaining about unable to find
png.h. I was not capable of fixing
this and turned to other options, but I am still curious how could I fix
Attempt 4: Fine, I’ll just go with the Conda package
Now it seems that my hope to use
Seurat on CRAN is not that wise, and
my dataset is in fact compatible with
Seurat v2.2.0 on bioconda.
Perhaps this would be a much more efficient work-around.
Since it is in the bioconda repository, I need to set the channel first.
conda config — add channels defaults conda config — add channels conda-forge conda config — add channels bioconda
conda install -c bioconda r-seurat.
What I got was:
UnsatisfiableError: The following specifications were found to be in conflict: - r-reprex - r-seurat
Checking dependency with
conda info r-seurat showed that it requires
ver 3.4.1 of
r-reprex need >3.4.3. This prevented me
Instead, I built
Seurat from CRAN with
conda skeleton cran Seurat.
Interestingly, it saved the recipe in
[pwd]/r-seurat instead of
conda build r-seurat, guess what I got?
Error : object ‘map_dfr’ is not exported by ‘namespace:purrr’ ERROR: lazy loading failed for package ‘Seurat’ subprocess.CalledProcessError: Command ‘[‘/bin/bash’, ‘-e’, ‘[pwd]/anaconda/conda-bld/r-seurat_1525165846607/work/conda_build.sh’]’ returned non-zero exit status 1.
It turned out
purrr::map_dfr(), which was introduced
in newer version than what is on bioconda. A new version of
Conda-forge fixed this, but then there was compilaton error mentioned
earlier in this blog.