A minimal R API for Python
Minimal R API for Python
import rapi from rapi import rcopy, reval rapi.start() rcopy(reval("R.version"))
# install released version pip install -U rapi # or the development version pip install -U git+https://github.com/randy3k/rapi
Why another R interface when there is
rapiis 100% python
rapi is primarily used by
rtichoke which is an alternate R console.
rpy2 was not an option because it requires compilations and who wants to compile!?
At stated above,
rpy2 requires tool chains to install which makes it not portable.
rapi on the other hand is lightweight and portable.
rpy2 supports a large number of python and R packages, such as numpy, scipy, ggplot2 etc. But there are situations a user may just want to compute a simple thing from R. Additionally, I found that the interface of
rpy2 is not very discoverable.
rapiis a brother of
I am the same developer behind the Julia package
RCall.jl which allows Julia to communicate with R.
RCall.jl share a very similar design. For example,
rcopy(reval("1")) works for both
rapiis compatible with
reticulate. Objects can be converted seamlessly between
reticulate. Check the section for
rapi may fail to open the shared library.
- On Linux
First, try to expose R to PATH.
Note that it should be the path to
R_HOME, not the path to the R binary. The
folder should contain a file called
COPYING. In some cases, you may need to
$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:`R RHOME`/lib"
- On Windows
Make sure that the path(s) to
R.dll is in the
Very minimal API
import rapi rapi.start() from rapi import rcopy, robject, reval, rcall
reval- evaluate an R expression in the global environment
a = reval("1:5")
rcopy- convert any RObject returned by
revalto its python type
b = rcopy(a)
robject- convert any python object to its R type
c = robject(b)
rcall- call an R function. Python objects are converted to RObjects implicitly.
d = rcall("sum", c)
R Eventloop in IPython
When running interactively in IPython, R events such as showing graphical
devices could be handled by the
r eventloop. Simply enter in IPython
# some preparation work # Unix users may need this PR: https://github.com/rstudio/reticulate/pull/279 # Windows + Python 2.7 users may need this PR: https://github.com/rstudio/reticulate/pull/335 # See also https://github.com/randy3k/rtichoke#how-to-specify-r_home-location import os import sys os.environ["RETICULATE_PYTHON"] = sys.executable os.environ["RETICULATE_REMAP_OUTPUT_STREAMS"] = "0" import rapi rapi.start() from rapi import * reval("library(reticulate)"); py_object = reval("r_to_py(LETTERS)") rcopy(py_object) class Foo(object): pass foo = Foo() rcall("r_to_py", robject(foo))
library(reticulate) py_run_string("import rapi") py_run_string("rapi.start()") py_run_string("from rapi import *") r_object = py_eval("reval('LETTERS')") py_to_r(r_object) py_run_string("class Foo(object): pass") py_run_string("foo = Foo()") py_object = py_eval("robject(foo)") r_to_py(py_to_r(py_object))