Next: , Previous: Useful examples, Up: Useful examples  


4.3.1 Enhanced Robj

This example shows an extended Robj type which supports R attribute look up via normal Python attribute access. It also supports the representation given by the R interpreter, and it implements the as_r() method for converting itself to R.

In Python 2.2 you can take advantage of the possibility to subclass types, and the examples can be rewritten in a more powerful way. However, these examples are Python 2.1 and 2.2 compatible.

File erobj.py:

from rpy import *

class ERobj:

    def __init__(self, robj):
        self.robj = robj

    def as_r(self):
        return self.robj

    def __str__(self):
        a = with_mode(NO_CONVERSION,
                      lambda: r.textConnection('tmpobj', 'w'))()
        r.sink(file=a, type='output')
        r.print_(self.robj)
        r.sink()
        r.close_connection(a)
        str = with_mode(BASIC_CONVERSION,
                        lambda: r('tmpobj'))()
        return '\n'.join(as_list(str))

    def __getattr__(self, attr):
        e = with_mode(BASIC_CONVERSION,
                      lambda: r['$'](self.robj, attr))()
        if e:
            return e
        return self.__dict__[attr]

The __str__ method makes the R interpreter print to the tmpobj R variable. Then, it is retrieved and returned as the string representation of the object. Note the use of the with_mode function for not changing the mode in use. Note, also, the use of the utility functions as_list and r (see Miscellaneous).

An example of use:

>>> from rpy import *
>>> from erobj import *
>>> proc_table[lambda o: 1] = ERobj
>>> set_default_mode(PROC_CONVERSION)
>>>
>>> e = r.t_test([1,2,3])
>>> e
<erobj.ERobj instance at 0x8ad4ea4>
>>> print e

        One Sample t-test

data:  c(1, 2, 3) 
t = 3.4641, df = 2, p-value = 0.07418
alternative hypothesis: true mean is not equal to 0 
95 percent confidence interval:
 -0.4841377  4.4841377 
sample estimates:
mean of x 
        2 

>>>
>>> e.statistic
{'t': 3.4641016151377548}