Python in R (reticulate) — Operations Cheatsheet

Author

Janpieter van der Pol

0) Mental model (what “activation” means in R)

In R, you typically select which Python / environment reticulate binds to (via use_*() or RETICULATE_PYTHON).
That is not the same as running conda activate in a shell, but the outcome is similar: all Python calls from R go to that interpreter.

Rule of thumb: call use_*() (or set RETICULATE_PYTHON) before any Python is initialized, then restart R if you change it later.


1) Install Python “from R”

Option B — Install CPython builds via reticulate (macOS/Linux; builds from source)

library(reticulate)

# List available versions (if desired)
reticulate::install_python(list = TRUE)

# Install a specific Python version
reticulate::install_python("3.11:latest")

Option C — Use an existing system Python (Homebrew / pyenv / OS install)

You can point reticulate to an existing interpreter by path:

library(reticulate)

reticulate::use_python("/usr/local/bin/python3", required = TRUE)
# On Apple Silicon this is often: /opt/homebrew/bin/python3

2) Create an environment + install packages

You have two mainstream approaches:

  • virtualenv / venv (lightweight; often best on macOS/Linux)
  • conda (great cross-platform; easiest on Windows)

2A) Virtualenv / venv (reticulate-managed)

Create

library(reticulate)

# Create env "my-venv" using a specific python (path or version constraint)
reticulate::virtualenv_create(
  envname = "my-venv",
  python  = "3.11"     # or "/path/to/python3.11"
)

Install packages into that venv

reticulate::virtualenv_install(
  envname   = "my-venv",
  packages  = c("numpy", "pandas", "scikit-learn")
)

2B) Conda environments (including Miniconda/Miniforge)

Create

library(reticulate)

# Create conda env with a specific Python version
reticulate::conda_create(
  envname        = "my-conda",
  python_version = "3.11"
)

Install packages from conda channels

reticulate::conda_install(
  envname  = "my-conda",
  packages = c("numpy", "pandas", "scikit-learn")
)

Install packages via pip inside the conda env

reticulate::conda_install(
  envname  = "my-conda",
  packages = c("bertopic==0.16.3", "sentence-transformers"),
  pip      = TRUE
)

3) “Activate” / select the environment in R (and in Quarto)

Virtualenv

library(reticulate)

reticulate::use_virtualenv("my-venv", required = TRUE)
reticulate::py_config()

Conda

library(reticulate)

reticulate::use_condaenv("my-conda", required = TRUE)
reticulate::py_config()

Miniconda (reticulate-managed install)

library(reticulate)

# Uses only the Miniconda installed by reticulate::install_miniconda()
reticulate::use_miniconda("my-conda", required = TRUE)
reticulate::py_config()

4) List environments

Conda envs

library(reticulate)
reticulate::conda_list()

Virtualenvs

library(reticulate)
reticulate::virtualenv_list()

5) Make RStudio “find” the right Python

You have three common mechanisms. Pick one and be consistent.

5A) RStudio GUI (Global Options)

In RStudio: Tools → Global Options → Python
Select the interpreter (system Python, conda env python, or venv python).

5C) Project .Rprofile

# .Rprofile (project root)
Sys.setenv(RETICULATE_PYTHON = "/absolute/path/to/python")

Then restart R.


6) Verify what reticulate is using

library(reticulate)

reticulate::py_config()            # the active python + key paths
reticulate::py_discover_config()   # what reticulate discovers on your system

Check if a module is available:

reticulate::py_module_available("numpy")

7) Package operations (check / uninstall) from R

7A) List installed packages (pip)

This works for both venvs and conda envs, as long as you call the env’s python.

library(reticulate)

py <- reticulate::py_config()$python
system2(py, c("-m", "pip", "list"))

7B) Show one package version quickly

library(reticulate)

np <- reticulate::import("numpy")
np$`__version__`

7C) Uninstall a package (pip)

library(reticulate)

py <- reticulate::py_config()$python
system2(py, c("-m", "pip", "uninstall", "-y", "somepackage"))

7D) Remove a package from a conda env (conda remove)

library(reticulate)

reticulate::conda_remove(
  envname   = "my-conda",
  packages  = "somepackage"
)

8) Remove an environment

8A) Remove a virtualenv

library(reticulate)

reticulate::virtualenv_remove("my-venv", confirm = FALSE)

8B) Remove a conda environment (entire env)

library(reticulate)

# Removes the entire environment
reticulate::conda_remove(envname = "my-conda", packages = NULL)

Terminal equivalent (often the most robust):

conda env remove -n my-conda

9) Using Miniconda vs Miniforge / “Which conda does reticulate use?”

9A) Use the reticulate-managed Miniconda

library(reticulate)

reticulate::install_miniconda()
reticulate::miniconda_path()

9B) Tell reticulate to use a specific conda (Miniforge / Anaconda)

Force the conda binary used by reticulate:

options(reticulate.conda_binary = "/absolute/path/to/conda")

Or via environment variable (e.g., in .Renviron):

RETICULATE_CONDA=/absolute/path/to/conda

Then use conda functions as usual:

library(reticulate)

reticulate::conda_list(conda = "auto")  # follows your forced conda location

10) “Set a Python install when creating the environment”

Virtualenv: choose the starter python

library(reticulate)

reticulate::virtualenv_create(
  envname = "my-venv",
  python  = "/absolute/path/to/python3.11"  # or "3.11"
)

Conda: choose python_version

library(reticulate)

reticulate::conda_create(
  envname        = "my-conda",
  python_version = "3.11"
)

11) Quarto tip: confirm the interpreter from a Python chunk

import sys
print(sys.executable)
/Users/janpieter/.virtualenvs/bertopic_r_env_spacy/bin/python

That executable is controlled by the same selection mechanisms above (RStudio setting / RETICULATE_PYTHON / use_*()), depending on how you render.


12) Minimal “known-good” workflows

Workflow A (Miniconda + conda env)

library(reticulate)
reticulate::install_miniconda()
reticulate::conda_create("my-conda", python_version = "3.11")
reticulate::conda_install("my-conda", c("numpy", "pandas"))
reticulate::use_condaenv("my-conda", required = TRUE)
reticulate::py_config()

Workflow B (System python + venv)

library(reticulate)
reticulate::virtualenv_create("my-venv", python = "3.11")
reticulate::virtualenv_install("my-venv", c("numpy", "pandas"))
reticulate::use_virtualenv("my-venv", required = TRUE)
reticulate::py_config()