install.packages("reticulate")
library(reticulate)
# Install a private Miniconda managed by reticulate
reticulate::install_miniconda()Python in R (reticulate) — Operations Cheatsheet
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 A — Install Miniconda via reticulate (recommended for most users, especially Windows)
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/python32) 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).
5B) Project-level .Renviron (recommended for reproducible projects)
Create a file named .Renviron in your project root:
RETICULATE_PYTHON=/absolute/path/to/python
Examples:
- Conda env python:
.../miniconda3/envs/my-conda/bin/python - Virtualenv python:
.../project/.venv/bin/python
Then restart R.
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 systemCheck 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-conda9) 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 location10) “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()