Skip to content

Instantly share code, notes, and snippets.

@lgautier
Created September 30, 2014 02:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lgautier/955e14077322480803e2 to your computer and use it in GitHub Desktop.
Save lgautier/955e14077322480803e2 to your computer and use it in GitHub Desktop.
rpy2 and HTML display in ipython
{
"metadata": {
"name": "",
"signature": "sha256:e814b7d85c1dc274b3c62ca6849951326dee84fa31b999f9735064f46fb45a7a"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import jinja2\n",
"from IPython.display import HTML\n",
"template_list = jinja2.Template(\"\"\"\n",
"<style>\n",
"</style>\n",
"<p><emph>{{ clsname }}</emph> with {{ rlist | length }} elements:</p>\n",
"<ul class=\"rpy2\">\n",
"{%- for elt_i in range(display_neltmax) %}\n",
" <li><b>{{ rlist.names[elt_i] }} :</b> {{ rlist[elt_i] }}</li>\n",
"{%- endfor %}\n",
"{%- if display_neltmax < (rlist | length) %}\n",
" <li>...</li> \n",
"{%- endif %}\n",
"</ul>\n",
"\"\"\")\n",
"\n",
"template_dataframe = jinja2.Template(\"\"\"\n",
"<style>\n",
"table.rpy2 {\n",
" border: solid 1px rgb(180, 180, 180);\n",
"}\n",
"table.rpy2 th {\n",
" background-color: rgb(215, 215, 215);\n",
"}\n",
"table.rpy2 td {\n",
" text-align: right;\n",
" font-family: monospace;\n",
"}\n",
"</style>\n",
"<emph>{{ clsname }}</emph> with {{ dataf | length }} columns:\n",
"<table class=\"rpy2\">\n",
" <thead>\n",
" <tr>\n",
"{%- for col_i in range(display_ncolmax - 2) %}\n",
" <th>{{ dataf.names[col_i] }}</th>\n",
"{%- endfor %}\n",
"{%- if display_ncolmax < dataf.ncol %}\n",
" <th>...</th> \n",
"{%- endif %}\n",
"{%- for col_i in range(2) %}\n",
" <th>{{ dataf.names[col_i+display_ncolmax] }}</th>\n",
"{%- endfor %}\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
"{%- for row_i in range(display_nrowmax - 3) %}\n",
" <tr>\n",
" {%- for col_i in range(display_ncolmax - 2) %}\n",
" <td>{{ dataf[col_i][row_i] }}</td>\n",
" {%- endfor %}\n",
" {%- if display_ncolmax < dataf.ncol %}\n",
" <td>...</td> \n",
" {%- endif %}\n",
" {%- for col_i in range(2) %}\n",
" <td>{{ dataf[col_i+display_ncolmax][row_i] }}</td>\n",
" {%- endfor %}\n",
" </tr>\n",
"{%- endfor %}\n",
"\n",
"{%- if dataf.nrow > display_nrowmax %}\n",
" <tr>\n",
" {%- for col_i in range(display_ncolmax - 2) %}\n",
" <td>...</td>\n",
" {%- endfor %}\n",
" {%- if display_ncolmax < dataf.ncol %}\n",
" <td>...</td> \n",
" {%- endif %}\n",
" {%- for col_i in range(2) %}\n",
" <td>...</td>\n",
" {%- endfor %}\n",
" </tr>\n",
"{%- endif %}\n",
"\n",
"{%- for row_i in range(3) %}\n",
" <tr>\n",
" {%- for col_i in range(display_ncolmax - 2) %}\n",
" <td>{{ dataf[col_i][row_i+display_nrowmax] }}</td>\n",
" {%- endfor %}\n",
" {%- if display_ncolmax < dataf.ncol %}\n",
" <td>...</td> \n",
" {%- endif %}\n",
" {%- for col_i in range(2) %}\n",
" <td>{{ dataf[col_i+display_ncolmax][row_i+display_nrowmax] }}</td>\n",
" {%- endfor %}\n",
" </tr>\n",
"{%- endfor %}\n",
" </tbody>\n",
"</table>\n",
"\"\"\")\n",
"\n",
"template_ridentifiedobject = jinja2.Template(\"\"\"\n",
"<ul style=\"list-style-type: none;\">\n",
"<li>{{ clsname }} objects</li>\n",
"<li>Origin in R: {{ origin }}</li>\n",
"</ul>\n",
"\"\"\")\n",
"\n",
"from rpy2.robjects import vectors, RObject, SignatureTranslatedFunction\n",
"\n",
"ip = get_ipython()\n",
"html_f = ip.display_formatter.formatters['text/html']\n",
"def html_rlist(rlist):\n",
" html = template_list.render({\n",
" 'clsname': type(rlist).__name__,\n",
" 'rlist': rlist,\n",
" 'display_neltmax': min(10, len(rlist))})\n",
" return html\n",
"html_f.for_type(vectors.ListVector, html_rlist)\n",
"def html_rdataframe(dataf):\n",
" html = template_dataframe.render({'dataf': dataf,\n",
" 'clsname': type(dataf).__name__,\n",
" 'display_nrowmax': min(10, dataf.nrow),\n",
" 'display_ncolmax': min(6, dataf.ncol)})\n",
" return html\n",
"html_f.for_type(vectors.DataFrame, html_rdataframe)\n",
"\n",
"from rpy2 import rinterface\n",
"def wherefrom(name, startenv=rinterface.globalenv):\n",
" \"\"\" when calling 'get', where the R object is coming from. \"\"\"\n",
" env = startenv\n",
" obj = None\n",
" retry = True\n",
" while retry:\n",
" try:\n",
" obj = env[name]\n",
" retry = False\n",
" except LookupError:\n",
" env = env.enclos()\n",
" if env.rsame(rinterface.emptyenv):\n",
" retry = False\n",
" else:\n",
" retry = True\n",
" return env\n",
"\n",
"def html_ridentifiedobject(obj):\n",
" if hasattr(obj, '__rname__') and obj.__rname__ is not None:\n",
" env = wherefrom(obj.__rname__)\n",
" try:\n",
" origin = env.do_slot('name')[0]\n",
" except LookupError:\n",
" origin = 'package:base ?'\n",
" else:\n",
" origin = '???'\n",
" html = template_ridentifiedobject.render({\n",
" 'clsname': type(obj).__name__,\n",
" 'origin': origin,\n",
" 'obj': obj})\n",
" return html\n",
"html_f.for_type(RObject, html_ridentifiedobject)\n",
"html_f.for_type(SignatureTranslatedFunction, html_ridentifiedobject)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"R `list`"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"rlist = vectors.ListVector({'a': 1,\n",
" 'b': 'cde'})\n",
"rlist"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"<style>\n",
"</style>\n",
"<p><emph>ListVector</emph> with 2 elements:</p>\n",
"<ul class=\"rpy2\">\n",
" <li><b>b :</b> [1] \"cde\"\n",
"</li>\n",
" <li><b>a :</b> [1] 1\n",
"</li>\n",
"</ul>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"<ListVector - Python:0x7fc1a91083c8 / R:0x2caf540>\n",
"[StrVector, IntVector]\n",
" b: <class 'rpy2.robjects.vectors.StrVector'>\n",
" <StrVector - Python:0x7fc1a9110048 / R:0x2bb3fe8>\n",
"['cde']\n",
" a: <class 'rpy2.robjects.vectors.IntVector'>\n",
" <IntVector - Python:0x7fc1a9110448 / R:0x2bb4018>\n",
"[ 1]"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"R `data.frame`"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from rpy2.robjects.packages import importr, data\n",
"datasets = importr('datasets')\n",
"dataf = data(datasets).fetch('mtcars')['mtcars']\n",
"dataf"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"<style>\n",
"table.rpy2 {\n",
" border: solid 1px rgb(180, 180, 180);\n",
"}\n",
"table.rpy2 th {\n",
" background-color: rgb(215, 215, 215);\n",
"}\n",
"table.rpy2 td {\n",
" text-align: right;\n",
" font-family: monospace;\n",
"}\n",
"</style>\n",
"<emph>DataFrame</emph> with 11 columns:\n",
"<table class=\"rpy2\">\n",
" <thead>\n",
" <tr>\n",
" <th>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>...</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>21.0</td>\n",
" <td>6.0</td>\n",
" <td>160.0</td>\n",
" <td>110.0</td>\n",
" <td>...</td>\n",
" <td>16.46</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>21.0</td>\n",
" <td>6.0</td>\n",
" <td>160.0</td>\n",
" <td>110.0</td>\n",
" <td>...</td>\n",
" <td>17.02</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>22.8</td>\n",
" <td>4.0</td>\n",
" <td>108.0</td>\n",
" <td>93.0</td>\n",
" <td>...</td>\n",
" <td>18.61</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>21.4</td>\n",
" <td>6.0</td>\n",
" <td>258.0</td>\n",
" <td>110.0</td>\n",
" <td>...</td>\n",
" <td>19.44</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18.7</td>\n",
" <td>8.0</td>\n",
" <td>360.0</td>\n",
" <td>175.0</td>\n",
" <td>...</td>\n",
" <td>17.02</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18.1</td>\n",
" <td>6.0</td>\n",
" <td>225.0</td>\n",
" <td>105.0</td>\n",
" <td>...</td>\n",
" <td>20.22</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14.3</td>\n",
" <td>8.0</td>\n",
" <td>360.0</td>\n",
" <td>245.0</td>\n",
" <td>...</td>\n",
" <td>15.84</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <td>17.8</td>\n",
" <td>6.0</td>\n",
" <td>167.6</td>\n",
" <td>123.0</td>\n",
" <td>...</td>\n",
" <td>18.9</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>16.4</td>\n",
" <td>8.0</td>\n",
" <td>275.8</td>\n",
" <td>180.0</td>\n",
" <td>...</td>\n",
" <td>17.4</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>17.3</td>\n",
" <td>8.0</td>\n",
" <td>275.8</td>\n",
" <td>180.0</td>\n",
" <td>...</td>\n",
" <td>17.6</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"<DataFrame - Python:0x7fc1a9120108 / R:0x29709f0>\n",
"[Float..., Float..., Float..., ..., Float..., Float..., Float...]\n",
" mpg: <class 'rpy2.robjects.vectors.FloatVector'>\n",
" <FloatVector - Python:0x7fc1a9120488 / R:0x2eefae0>\n",
"[21.000000, 21.000000, 22.800000, ..., 19.700000, 15.000000, 21.400000]\n",
" cyl: <class 'rpy2.robjects.vectors.FloatVector'>\n",
" <FloatVector - Python:0x7fc1a9120988 / R:0x2629ca0>\n",
"[6.000000, 6.000000, 4.000000, ..., 6.000000, 8.000000, 4.000000]\n",
" disp: <class 'rpy2.robjects.vectors.FloatVector'>\n",
" <FloatVector - Python:0x7fc1a9120e88 / R:0x262c320>\n",
"[160.000000, 160.000000, 108.000000, ..., 145.000000, 301.000000, 121.000000]\n",
" ...\n",
" mpg: <class 'rpy2.robjects.vectors.FloatVector'>\n",
" <FloatVector - Python:0x7fc1a9123508 / R:0x2fdec90>\n",
"[1.000000, 1.000000, 1.000000, ..., 1.000000, 1.000000, 1.000000]\n",
" cyl: <class 'rpy2.robjects.vectors.FloatVector'>\n",
" <FloatVector - Python:0x7fc1a9123a08 / R:0x31e6590>\n",
"[4.000000, 4.000000, 4.000000, ..., 5.000000, 5.000000, 4.000000]\n",
" disp: <class 'rpy2.robjects.vectors.FloatVector'>\n",
" <FloatVector - Python:0x7fc1a9120f88 / R:0x326d340>\n",
"[4.000000, 4.000000, 1.000000, ..., 6.000000, 8.000000, 2.000000]"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from rpy2 import robjects"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"robjects.r.sd"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"<ul style=\"list-style-type: none;\">\n",
"<li>SignatureTranslatedFunction objects</li>\n",
"<li>Origin in R: package:stats</li>\n",
"</ul>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"<SignatureTranslatedFunction - Python:0x7fc1c5128548 / R:0x269abd0>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from rpy2.robjects.packages import importr\n",
"ggplot2 = importr('ggplot2')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ggplot2.ggplot"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"<ul style=\"list-style-type: none;\">\n",
"<li>DocumentedSTFunction objects</li>\n",
"<li>Origin in R: package:ggplot2</li>\n",
"</ul>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"<DocumentedSTFunction - Python:0x7fc1a909b388 / R:0x4025ae0>"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment