Revision: 654
http://rpy.svn.sourceforge.net/rpy/?rev=654&view=rev
Author: lgautier
Date: 2008-10-11 15:22:21 +0000 (Sat, 11 Oct 2008)
Log Message:
-----------
Option to find R object as attributes of the r instance.
Modified Paths:
--------------
branches/rpy_nextgen/NEWS
branches/rpy_nextgen/doc/source/robjects.rst
branches/rpy_nextgen/rpy/robjects/__init__.py
branches/rpy_nextgen/rpy/robjects/tests/testRobjects.py
Modified: branches/rpy_nextgen/NEWS
===================================================================
--- branches/rpy_nextgen/NEWS 2008-09-11 07:08:55 UTC (rev 653)
+++ branches/rpy_nextgen/NEWS 2008-10-11 15:22:21 UTC (rev 654)
@@ -14,6 +14,8 @@
- added functions :func:`get_initoptions` and :func:`set_initoptions`.
+- new attribute :attr:`_dotter` for :class:`R` singleton. Setting it to True
will translate '_' into '.' if the attribute is not found
+
Changes
-------
Modified: branches/rpy_nextgen/doc/source/robjects.rst
===================================================================
--- branches/rpy_nextgen/doc/source/robjects.rst 2008-09-11 07:08:55 UTC
(rev 653)
+++ branches/rpy_nextgen/doc/source/robjects.rst 2008-10-11 15:22:21 UTC
(rev 654)
@@ -44,7 +44,9 @@
>>> print(robjects.r)
The instance can be seen as the entry point to an
-embedded R process, and the elements that would be accessible
+embedded R process.
+
+The elements that would be accessible
from an equivalent R environment are accessible as attributes
of the instance.
Readers familiar with the :mod:`ctypes` module for Python will note
@@ -61,7 +63,23 @@
>>> plot = robjects.r.plot
>>> dir = robjects.r.dir
+This approach has limitation as:
+ * The actual Python attributes for the object masks the R elements
+
+ * '.' (dot) is syntactically valid name for R objects, but not for
+ python objects.
+
+That last limitation can partly be removed by setting the attribute
+:attr:`_dotter` from False to True.
+
+>>> robjects.r.as_null
+# AttributeError raised
+>>> robjects.r._dotter = True
+>>> robjects.r.as_null
+# R function as.null() returned
+
+
Strings as R code
-----------------
Modified: branches/rpy_nextgen/rpy/robjects/__init__.py
===================================================================
--- branches/rpy_nextgen/rpy/robjects/__init__.py 2008-09-11 07:08:55 UTC
(rev 653)
+++ branches/rpy_nextgen/rpy/robjects/__init__.py 2008-10-11 15:22:21 UTC
(rev 654)
@@ -440,6 +440,7 @@
class R(object):
_instance = None
+ _dotter = False
def __init__(self):
if R._instance is None:
@@ -450,10 +451,28 @@
#raise(RuntimeError("Only one instance of R can be created"))
def __getattribute__(self, attr):
- return self[attr]
+ try:
+ return super(R, self).__getattribute__(attr)
+ except AttributeError, ae:
+ orig_ae = ae
+ try:
+ return self[attr]
+ except LookupError, le:
+ pass
+
+ if self._dotter:
+ attr = attr.replace('_', '.')
+ try:
+ return self[attr]
+ except LookupError, le:
+ pass
+
+ raise orig_ae
+
def __getitem__(self, item):
res = rinterface.globalEnv.get(item)
+
res = ri2py(res)
return res
Modified: branches/rpy_nextgen/rpy/robjects/tests/testRobjects.py
===================================================================
--- branches/rpy_nextgen/rpy/robjects/tests/testRobjects.py 2008-09-11
07:08:55 UTC (rev 653)
+++ branches/rpy_nextgen/rpy/robjects/tests/testRobjects.py 2008-10-11
15:22:21 UTC (rev 654)
@@ -5,6 +5,11 @@
class RInstanceTestCase(unittest.TestCase):
+
+ def tearDow(self):
+ robjects.r._dotter = False
+
+
def testGetItem(self):
letters_R = robjects.r["letters"]
self.assertTrue(isinstance(letters_R, robjects.RVector))
@@ -23,6 +28,12 @@
self.assertEquals(i, myList[i][0])
+ def testGetAttr(self):
+ robjects.r._dotter = True
+ self.assertRaises(LookupError, robjects.r.__getitem__, 'as_null')
+ res = robjects.r.as_null
+ self.assertTrue(isinstance(res, rinterface.SexpClosure))
+
def testEval(self):
# vector long enough to span across more than one line
x = robjects.baseNameSpaceEnv['seq'](1, 50, 2)
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
rpy-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list