Skip to main content

Polyester

Polyester makes it possible to use R from Python by running R in a background process and communicating through a lightweight message protocol.

The goal is simplicity and reliability — especially on Windows — while keeping the design extensible to other languages in the future.


Quick Example

from polyester import RInterpreter

# Start an R interpreter
R = RInterpreter(path=r"C:\Program Files\R\R-4.5.2\bin\Rscript.exe")

# Access an R module (namespace)
rbase = R.module("base")

# Simple calculations
x = R.eval("sin(100)")
y = rbase.cos(100)

# Get results in python
print(R.get(x), R.get(y))

# Bring a dataframe from R to Python
iris_rdf = R.eval("iris")            # RemoteObject
iris_df = R.get(iris_rdf, "pandas")  # Python/pandas object
print(iris_df.head())

Core Concepts

Polyester revolves around a single concept: an interpreter.

An interpreter manages:

  • A background R process
  • A private remote environment
  • Communication over JSON Lines
  • Data exchange using Apache Arrow

Interpreter API

An interpreter supports the following operations:

Operation Parameters Returns Description
insert x: simple/dataframe RemoteObject Send Python data to R
get x: Remote simple/dataframe Retrieve data from R
R.objects.name name: str RemoteName (lazy) Reference a remote symbol
R.objects.name = value name: str, value: simple/Remote Assign remotely
eval code: str RemoteObject Evaluate R code
exec code: str Execute R code (no return value)
call f: Remote, *args, **kwargs RemoteObject Call a remote function

RemoteObject vs RemoteName

  • RemoteObject A concrete object that exists in the remote R environment. Automatically cleaned up when the Python object is deleted.

  • RemoteName A lazy reference to a symbol or expression in R. It may or may not exist until evaluated.

Example:

R.objects.x = 10
result = R.get(R.objects.x)   # 10

Data Exchange

DataFrames are transferred using Apache Arrow files for efficiency.

You can request a specific backend when retrieving:

df = R.get(iris_rdf, "pandas")

If no df_backend is provided, polars will be used.


Important Notes

Do not print to stdout from R.

Polyester uses stdout for protocol communication. Printing to stdout() inside R will corrupt the communication channel.

If you need logging inside R, use:

message("debug info")

or write to stderr().


Why Not Use rpy2?

rpy2 is a mature and powerful solution.

However:

  • rpy2 is currently difficult to use on Windows in many environments.
  • Polyester runs R as a subprocess and avoids tight binary coupling.
  • The architecture is language-agnostic and may support additional languages (e.g., Julia) in the future.

If rpy2 becomes reliably usable in all target environments, Polyester may optionally integrate with it.


Design Goals

  • ✅ Windows support
  • ✅ Minimal external dependencies
  • ✅ Simple, explicit API
  • ✅ Subprocess isolation
  • 🔄 Possible future multi-language support

Performance is important, but clarity and robustness are higher priorities at this stage.


Implementation Details

  • R is started as a background subprocess.
  • Communication happens over JSON Lines.
  • DataFrames are exchanged via Apache Arrow files.
  • Remote objects are reference-tracked and cleaned up automatically.

Status

Completed

  • Start R subprocess in background
  • JSON Lines protocol for communication
  • DataFrame transfer using Apache Arrow
  • Remote object lifecycle management

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

polyester-0.2.1-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file polyester-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: polyester-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 17.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for polyester-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a3b01b4cbdb54d7b8a2aabbfb4fd536bd9b27d44bc76661dddc95ca8df10a628
MD5 bb5676d7cf4728efc5933f26e882e666
BLAKE2b-256 c8289b5e0d2aef1df363fc5a601ed81dc48bd1c8b7a6579642095508a3b1ae98

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