Created
September 30, 2014 02:36
-
-
Save lgautier/955e14077322480803e2 to your computer and use it in GitHub Desktop.
rpy2 and HTML display in ipython
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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