import jinja2 # type: ignore
from rpy2.robjects import (vectors,
RObject,
SignatureTranslatedFunction,
RS4)
from rpy2 import rinterface
from rpy2.robjects.packages import SourceCode
from rpy2.robjects.packages import wherefrom
from IPython import get_ipython # type: ignore
template_list = jinja2.Template("""
{{ clsname }} with {{ rlist | length }} elements:
{%- for elt_i in range(display_neltmax) %}
- {{ rlist.names[elt_i] }}
- {{ rlist[elt_i] }}
{%- endfor %}
{%- if display_neltmax < (rlist | length) %}
- ...
{%- endif %}
""")
template_vector_horizontal = jinja2.Template("""
{{ clsname }} with {{ vector | length }} elements:
{%- for elt_i in range(display_ncolmax - size_tail) %}
{{ vector[elt_i] }} |
{%- endfor %}
{%- if display_ncolmax < (vector | length) %}
... |
{%- endif %}
{%- for elt_i in elt_i_tail %}
{{ vector[elt_i] }} |
{%- endfor %}
""")
template_vector_vertical = jinja2.Template("""
{{ clsname }} with {{ vector | length }} elements:
{%- for elt_i in range(display_nrowmax - size_tail) %}
{{ elt_i }} |
{%- if has_vector_names %}
{{ vector.names[elt_i] }} |
{%- endif %}
{{ "%s" | format(vector[elt_i]) | truncate(12) }} |
{%- endfor %}
{%- if display_nrowmax < (vector | length) %}
... |
{%- if has_vector_names %}
... |
{%- endif %}
... |
{%- endif %}
{%- for elt_i in elt_i_tail %}
{{ elt_i }} |
{%- if has_vector_names %}
{{ vector.names[elt_i] }} |
{%- endif %}
{{ "%s" | format(vector[elt_i]) | truncate(12) }} |
{%- endfor %}
""")
template_dataframe = jinja2.Template("""
{{ clsname }} with {{ dataf.nrow }} rows and
{{ dataf | length }} columns:
|
{%- if has_rownames %}
|
{%- endif %}
{%- for col_i in range(display_ncolmax - size_coltail) %}
{{ dataf.names[col_i] }} |
{%- endfor %}
{%- if display_ncolmax < dataf.ncol %}
... |
{%- endif %}
{%- for col_i in col_i_tail %}
{{ dataf.names[col_i] }} |
{%- endfor %}
{%- for row_i in range(display_nrowmax - size_rowtail) %}
{{ row_i }} |
{%- if has_rownames %}
{{ dataf.rownames[row_i] }} |
{%- endif %}
{%- for col_i in range(display_ncolmax - size_coltail) %}
{{ dataf[col_i][row_i] }} |
{%- endfor %}
{%- if display_ncolmax < dataf.ncol %}
... |
{%- endif %}
{%- for col_i in col_i_tail %}
{{ dataf[col_i][row_i] }} |
{%- endfor %}
{%- endfor %}
{%- if dataf.nrow > display_nrowmax %}
... |
{%- if has_rownames %}
... |
{%- endif %}
{%- for col_i in range(display_ncolmax - size_coltail) %}
... |
{%- endfor %}
{%- if display_ncolmax < dataf.ncol %}
... |
{%- endif %}
{%- for col_i in range(2) %}
... |
{%- endfor %}
{%- endif %}
{%- for row_i in row_i_tail %}
{{ row_i }} |
{%- if has_rownames %}
{{ dataf.rownames[row_i] }} |
{%- endif %}
{%- for col_i in range(display_ncolmax - size_coltail) %}
{{ dataf[col_i][row_i] }} |
{%- endfor %}
{%- if display_ncolmax < dataf.ncol %}
... |
{%- endif %}
{%- for col_i in col_i_tail %}
{{ dataf[col_i][row_i] }} |
{%- endfor %}
{%- endfor %}
""")
template_ridentifiedobject = jinja2.Template("""
- {{ clsname }} object
- Origin in R: {{ origin }}
- Class(es) in R:
{%- for rclsname in obj.rclass %}
- {{ rclsname }}
{%- endfor %}
""")
template_rs4 = jinja2.Template("""
{{ clsname }} object |
Origin in R: |
{{ origin }} |
Class(es) in R: |
{%- for rclsname in obj.rclass %}
- {{ rclsname }}
{%- endfor %}
|
Attributes: |
{%- for sln in obj.slotnames() %}
- {{ sln }}
{%- endfor %}
|
""")
template_sourcecode = jinja2.Template("""
R source code:
{{ sourcecode }}
""")
class StrFactorVector(vectors.FactorVector):
def __getitem__(self, item):
integer = super(StrFactorVector, self).__getitem__(item)
# R is one-offset, Python is zero-offset
return self.levels[integer-1]
class StrDataFrame(vectors.DataFrame):
def __getitem__(self, item):
obj = super(StrDataFrame, self).__getitem__(item)
if isinstance(obj, vectors.FactorVector):
obj = StrFactorVector(obj)
return obj
def html_vector_horizontal(vector,
display_ncolmax=10,
size_tail=2,
table_class='rpy2_table'):
if isinstance(vector, vectors.FactorVector):
vector = StrFactorVector(vector)
html = template_vector_horizontal.render({
'table_class': table_class,
'clsname': type(vector).__name__,
'vector': vector,
'display_ncolmax': min(display_ncolmax, len(vector)),
'size_tail': size_tail,
'elt_i_tail': range(max(0, len(vector)-size_tail), len(vector))})
return html
def html_rlist(vector,
display_nrowmax=10,
size_tail=2,
table_class='rpy2_table'):
rg = range(max(0, len(vector)-size_tail), len(vector))
html = template_vector_vertical.render({
'table_class': table_class,
'clsname': type(vector).__name__,
'vector': vector,
'has_vector_names': vector.names is not rinterface.NULL,
'display_nrowmax': min(display_nrowmax, len(vector)),
'size_tail': size_tail,
'elt_i_tail': rg})
return html
def html_rdataframe(dataf,
display_nrowmax=10,
display_ncolmax=6,
size_coltail=2,
size_rowtail=2,
table_class='rpy2_table'):
html = template_dataframe.render(
{'dataf': StrDataFrame(dataf),
'table_class': table_class,
'has_rownames': dataf.rownames is not None,
'clsname': type(dataf).__name__,
'display_nrowmax': min(display_nrowmax, dataf.nrow),
'display_ncolmax': min(display_ncolmax, dataf.ncol),
'col_i_tail': range(max(0, dataf.ncol-size_coltail), dataf.ncol),
'row_i_tail': range(max(0, dataf.nrow-size_rowtail), dataf.nrow),
'size_coltail': size_coltail,
'size_rowtail': size_rowtail})
return html
def html_sourcecode(sourcecode):
from pygments import highlight # type: ignore
from pygments.lexers import SLexer # type: ignore
from pygments.formatters import HtmlFormatter # type: ignore
formatter = HtmlFormatter()
htmlcode = highlight(sourcecode, SLexer(), formatter)
d = {'sourcecode': htmlcode,
'syntax_highlighting': formatter.get_style_defs()}
html = template_sourcecode.render(d)
return html
def _dict_ridentifiedobject(obj):
if hasattr(obj, '__rname__') and obj.__rname__ is not None:
env = wherefrom(obj.__rname__)
try:
origin = env.do_slot('name')[0]
except LookupError:
origin = 'package:base ?'
else:
origin = '???'
d = {'clsname': type(obj).__name__,
'origin': origin,
'obj': obj}
return d
def html_ridentifiedobject(obj):
d = _dict_ridentifiedobject(obj)
html = template_ridentifiedobject.render(d)
return html
def html_rs4(obj, table_class='rpy2_table'):
d = _dict_ridentifiedobject(obj)
d['table_class'] = table_class
html = template_rs4.render(d)
return html
def init_printing():
ip = get_ipython()
html_f = ip.display_formatter.formatters['text/html']
html_f.for_type(vectors.Vector, html_vector_horizontal)
html_f.for_type(vectors.ListVector, html_rlist)
html_f.for_type(vectors.DataFrame, html_rdataframe)
html_f.for_type(RObject, html_ridentifiedobject)
html_f.for_type(RS4, html_rs4)
html_f.for_type(SignatureTranslatedFunction, html_ridentifiedobject)
html_f.for_type(SourceCode, html_sourcecode)