Skip to main content

Python-to-R interoperability engine with environment management, type-safe conversions, data normalization, and safe R function execution.

Project description

rpy-bridge

rpy-bridge is a Python-to-R a robust interoperability engine that combines environment management, type-safe conversions, data normalization, and safe function execution to make Python-R collaboration seamless.

It enables Python developers to call R functions, scripts, and packages safely while preserving type fidelity and project-specific R environments. This is ideal for bilingual teams where R authors maintain core logic, and Python-centric users need reliable access without rewriting code.

Latest release: rpy-bridge on PyPI


Key layers and capabilities

1. Lazy and robust R integration

  • Automatically detects or sets R_HOME and ensures rpy2 is installed.
  • Configures platform-specific dynamic library paths for macOS/Linux.

2. Environment management

  • Activates renv projects and loads project-specific libraries if it exists, otherwise use current environemnt.
  • Sources .Renviron and .Rprofile files to replicate the R project environment in Python.

3. Python ↔ R type conversion

  • Converts Python scalars, lists, dicts, and pandas DataFrames into appropriate R objects.
  • Converts R atomic vectors, ListVector/NamedList, and data.frames back into Python-native objects.
  • Handles nested structures, mixed types, and missing values robustly (NA_* → None/pd.NA).

4. Data hygiene and normalization

  • Post-processes R DataFrames: fixes dtypes, numeric/date conversions, and timezone issues.
  • Normalizes and aligns column types for accurate Python comparisons.
  • Supports comparing Python and R DataFrames with mismatch diagnostics.

5. Function calling

  • Calls functions from R scripts, base R, or installed packages safely.
  • Automatically converts arguments and return values, including keyword arguments.
  • Supports mixed data types, nested structures, and DataFrames seamlessly.

6. Python-first workflow for R code

  • Enables Python developers to reuse R functions without needing deep R knowledge.
  • Keeps network, token, and SSL concerns outside the package when sourcing scripts locally.
  • Designed for reproducibility and safe execution in CI or cross-platform environments.

Installation

Prerequisites

  • System R installed and available on PATH (rpy2 requires a working R installation).
  • Python 3.12+

From PyPI:

python3 -m pip install rpy-bridge

or using uv:

uv add rpy-bridge

During development (editable install):

python3 -m pip install -e .

or using uv:

uv sync

Required Python packages (the installer will pull these in):

  • rpy2 (GPLv2 or later)
  • pandas
  • numpy

Usage

from pathlib import Path
from rpy_bridge import RFunctionCaller

rfc = RFunctionCaller(
    path_to_renv=Path("/path/to/project"),
    script=Path("/path/to/script.R"),
)

summary_df = rfc.call("summarize_cohort", cohort_df)

Round-trip Python ↔ R behavior

rpy-bridge attempts to convert Python objects to R and back. Most objects used in scientific/ML pipelines round-trip cleanly, but some heterogeneous Python structures may be wrapped or slightly altered. This is normal due to R's type system.

Python type Round-trip fidelity Notes
int, float, bool, str ✅ High Scalars convert directly
Homogeneous list of numbers/strings/booleans ✅ High Converted to atomic R vectors
Nested lists of homogeneous types ✅ High Converted to nested R ListVector
pandas.DataFrame / pd.Series ✅ High Converted to data.frame / R vector, post-processed back
Mixed-type list or heterogeneous dict ⚠️ Partial Elements wrapped in single-element vectors; round-trip may alter type
Python None / pd.NA ✅ High Converted to R NULL

Guidance

  • Typical workflows (DataFrames, numeric arrays, series, homogeneous lists) are fully supported.
  • Rare or highly heterogeneous Python objects may not round-trip perfectly.
  • Round-trip fidelity is mainly a “nice-to-have” for debugging. For production pipelines, it’s safe to focus on supported types.

Examples

Basic — run a local R script

from pathlib import Path
from rpy_bridge import RFunctionCaller

project_dir = Path("/path/to/your-r-project")
script = project_dir / "scripts" / "example.R"

caller = RFunctionCaller(path_to_renv=project_dir, script_path=script)
result = caller.call("some_function", 42, named_arg="value")
print(type(result))

Call installed R packages (no local script)

from rpy_bridge import RFunctionCaller

caller = RFunctionCaller(path_to_renv=None, packages=["stats"])
samples = caller.call("rnorm", 5, mean=10)
print(type(samples))  # typically a numpy.ndarray

median_val = caller.call("stats::median", samples)
print(median_val)

R Setup

If you plan to execute R code with rpy-bridge, use the helper scripts in examples/r-deps/ to prepare an R environment.

  • On macOS (Homebrew) install system deps:
bash examples/r-deps/install_r_dev_deps_homebrew.sh
  • Initialize a project renv (run in an R session):
source("examples/r-deps/setup_env.R")
  • Restore the environment on a new machine:
renv::restore()

Collaboration note

This repository provides example R setup scripts for teams working across Python and R. Each project may require different R packages — check the package list in examples/r-deps/setup_env.R and commit a renv.lock for project-specific reproducibility.

Clone repositories containing R scripts locally or use your preferred tooling to obtain scripts before execution.


Licensing

  • rpy-bridge is released under the MIT License © 2025 Victoria Cheung.
  • The project depends on rpy2 which is licensed under the GNU General Public License v2 (or later).

Thanks

This package was spun out of internal tooling at Revolution Medicines. Many thanks to the team there for allowing the code to be open sourced.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rpy_bridge-0.3.8.tar.gz (21.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rpy_bridge-0.3.8-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

File details

Details for the file rpy_bridge-0.3.8.tar.gz.

File metadata

  • Download URL: rpy_bridge-0.3.8.tar.gz
  • Upload date:
  • Size: 21.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.11

File hashes

Hashes for rpy_bridge-0.3.8.tar.gz
Algorithm Hash digest
SHA256 58a7c25be81a9cf66cd520c34bf84b490aeeb0c3f3e36db1e1ca0789a959b15e
MD5 42cd47a91e010eddc06b138287566803
BLAKE2b-256 0423053634883ee7e0f62e4c7ca9a704ac36850e3236803b3edc1dd9433117c9

See more details on using hashes here.

File details

Details for the file rpy_bridge-0.3.8-py3-none-any.whl.

File metadata

  • Download URL: rpy_bridge-0.3.8-py3-none-any.whl
  • Upload date:
  • Size: 16.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.11

File hashes

Hashes for rpy_bridge-0.3.8-py3-none-any.whl
Algorithm Hash digest
SHA256 65a7f8e2dc1084270652440fbe8198af3849aff07a713b62fd3d4145a2a0611b
MD5 4dd2bb02ed9266cf3ce3def3414298d3
BLAKE2b-256 c00a8c8a30f9201022950f3be1e009d5ef7a7fb47eeaefddc5fa2a661d82220e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page