Revision: 647
          http://rpy.svn.sourceforge.net/rpy/?rev=647&view=rev
Author:   lgautier
Date:     2008-09-01 15:34:09 +0000 (Mon, 01 Sep 2008)

Log Message:
-----------
rinterface:

  - sexpTypeEmbeddedR() is now called str_typeint()

robjects:

  - fix in the string representation of R
  - getenvironment() for RFormula, 'environment' defined as a property
  - constructor for RDataFrame cleaned up and modified
  - getdim() for RArray, and dim now a property (no longer a test in 
__getattr__)

doc:

  still some editing

Modified Paths:
--------------
    branches/rpy_nextgen/NEWS
    branches/rpy_nextgen/README
    branches/rpy_nextgen/doc/source/rinterface.rst
    branches/rpy_nextgen/doc/source/robjects.rst
    branches/rpy_nextgen/rpy/rinterface/rinterface.c
    branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py
    branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py
    branches/rpy_nextgen/rpy/robjects/__init__.py
    branches/rpy_nextgen/rpy/robjects/tests/testRDataFrame.py
    branches/rpy_nextgen/rpy/robjects/tests/testRFormula.py

Modified: branches/rpy_nextgen/NEWS
===================================================================
--- branches/rpy_nextgen/NEWS   2008-08-28 07:19:07 UTC (rev 646)
+++ branches/rpy_nextgen/NEWS   2008-09-01 15:34:09 UTC (rev 647)
@@ -1,16 +1,38 @@
 SVN
 ===
 
+New features
+------------
+
+:mod:`rpy2.robjects`:
+
+- added :meth:`setenvironment` for :class:`RFormula`, and defined 
`environment` as a property
+
+- defined `names` as a property for :class:`RVector`
+
+
+Changes
+-------
+
+:mod:`rpy2.robjects`:
+
+- constructor for RDataFrame now now accepts either 
:class:`rlike.container.TaggedList` or :class:`rinterface.SexpEnvironment`
+
+:mod:`rpy2.rinterface`:
+
+- :func:`sexpTypeEmbeddedR` is now called :func:`str_typeint`.
+
 Bugs fixed
----------
+----------
 
-- Crash of :meth:`Sexp.enclos` when R not yet initialized (bug report #2078176)
+- crash of :meth:`Sexp.enclos` when R not yet initialized (bug report #2078176)
 
-- Potential crash of :meth:`Sexp.frame` when R not yet initialized
+- potential crash of :meth:`Sexp.frame` when R not yet initialized
 
-- Proper reference counting when handling, and deleting, :attr:`Sexp.__sexp__` 
instances
+- proper reference counting when handling, and deleting, :attr:`Sexp.__sexp__` 
generated CObjects
 
 
+
 Release 2.0.0a3
 ===============
 

Modified: branches/rpy_nextgen/README
===================================================================
--- branches/rpy_nextgen/README 2008-08-28 07:19:07 UTC (rev 646)
+++ branches/rpy_nextgen/README 2008-09-01 15:34:09 UTC (rev 647)
@@ -1,7 +1,16 @@
+This is the source tree or distribution for the rpy2 package.
 
-All this is under development, getting quickly to an alpha stage.
+Installation
+============
 
-The development is currently done with Python 2.5.2 and R-2.7.0-devel
+The disutils mechanism can be used:
 
-Compatibility with Python 2.4.x should be ok, now or later (might already be 
ok).
+python setup.py install
 
+Documentation
+=============
+
+Documentation is available either in the source tree (to be built),
+or as built HTML online (see the rpy home page on sourceforge).
+
+

Modified: branches/rpy_nextgen/doc/source/rinterface.rst
===================================================================
--- branches/rpy_nextgen/doc/source/rinterface.rst      2008-08-28 07:19:07 UTC 
(rev 646)
+++ branches/rpy_nextgen/doc/source/rinterface.rst      2008-09-01 15:34:09 UTC 
(rev 647)
@@ -286,6 +286,21 @@
 >>> LETTERS = rinterface.globalEnv.get("LETTERS") 
 
 
+R types
+^^^^^^^
+
+R vectors all have a `type`, sometimes referred to in R as a `mode`.
+This information is encoded as an integer by R, but it can sometimes be
+better for human reader to be able to provide a string.
+
+.. function:: str_typeint(typeint)
+
+   Return a string corresponding to a integer-encoded R type.
+
+   :param typeint: integer (as returned by :attr:`Sexp.typeof`)
+   :rtype: string
+
+
 .. index::
    pair: rinterface;indexing
 

Modified: branches/rpy_nextgen/doc/source/robjects.rst
===================================================================
--- branches/rpy_nextgen/doc/source/robjects.rst        2008-08-28 07:19:07 UTC 
(rev 646)
+++ branches/rpy_nextgen/doc/source/robjects.rst        2008-09-01 15:34:09 UTC 
(rev 647)
@@ -250,8 +250,10 @@
 
 A :class:`RDataFrame` represents the `R` class `data.frame`.
 
-Currently, the constructor is flagged as experimental. It accepts either a 
:class:`rinterface.SexpVector`
-or a dictonnary which elements will be the columns of the `data.frame`.
+Currently, the constructor is flagged as experimental.
+It accepts either a :class:`rinterface.SexpVector` 
+(with :attr:`typeof` equal to *VECSXP*)
+or an instance of class :class:`rpy2.rlike.container.TaggedList`.
 
 .. autoclass:: rpy2.robjects.RDataFrame
    :show-inheritance:

Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-08-28 07:19:07 UTC 
(rev 646)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c    2008-09-01 15:34:09 UTC 
(rev 647)
@@ -2376,8 +2376,8 @@
    EmbeddedR_setReadConsole_doc},
   {"findVarEmbeddedR", (PyCFunction)EmbeddedR_findVar,  METH_VARARGS,
    EmbeddedR_findVar_doc},
-  {"sexpTypeEmbeddedR",        (PyCFunction)EmbeddedR_sexpType, METH_VARARGS,
-   "Return the SEXP name tag corresponding to an integer."},
+  {"str_typeint",      (PyCFunction)EmbeddedR_sexpType, METH_VARARGS,
+   "Return the SEXP name tag (string) corresponding to an integer."},
   {NULL,               NULL}           /* sentinel */
 };
 
@@ -2545,7 +2545,6 @@
                               PyString_FromString("--no-save"))
                );
   PyModule_AddObject(m, "initOptions", initOptions);
-                              //                              
PyString_FromString("--quiet"))
 
 
   PyModule_AddObject(m, "Sexp", (PyObject *)&Sexp_Type);

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py 2008-08-28 
07:19:07 UTC (rev 646)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_EmbeddedR.py 2008-09-01 
15:34:09 UTC (rev 647)
@@ -32,7 +32,13 @@
         self.assertRaises(RuntimeError, t)
         rinterface.initr()
 
+    def testStr_typeint(self):
+        t = rinterface.baseNameSpaceEnv['letters']
+        self.assertEquals('STRSXP', rinterface.str_typeint(t.typeof))
+        t = rinterface.baseNameSpaceEnv['pi']
+        self.assertEquals('REALSXP', rinterface.str_typeint(t.typeof))
 
+
 class ObjectDispatchTestCase(unittest.TestCase):
     def testObjectDispatchLang(self):
         formula = rinterface.globalEnv.get('formula')

Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py      2008-08-28 
07:19:07 UTC (rev 646)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py      2008-09-01 
15:34:09 UTC (rev 647)
@@ -70,7 +70,14 @@
         sexp_a = rinterface.globalEnv.get("letters")
         self.assertRaises(ValueError, sexp_a.rsame, 'foo')
         
+    def testSexp_sexp_destroyCobj(self):
+        sexp = rinterface.IntSexpVector([1,2,3])
+        cobj = sexp.__sexp__
+        del(cobj)
+        # no real test, just make sure that it does
+        # not create a segfault
 
+
 def suite():
     suite = unittest.TestLoader().loadTestsFromTestCase(SexpTestCase)
     return suite

Modified: branches/rpy_nextgen/rpy/robjects/__init__.py
===================================================================
--- branches/rpy_nextgen/rpy/robjects/__init__.py       2008-08-28 07:19:07 UTC 
(rev 646)
+++ branches/rpy_nextgen/rpy/robjects/__init__.py       2008-09-01 15:34:09 UTC 
(rev 647)
@@ -8,6 +8,7 @@
 
 import os, sys
 import array
+import itertools
 import rpy2.rinterface as rinterface
 import rpy2.rlike.container as rlc
 
@@ -281,19 +282,20 @@
         if not r["is.array"](self)[0]:
             raise(TypeError("The object must be representing an R array"))
 
-    def __getattr__(self, name):
-        if name == 'dim':
-            res = r.dim(self)
-            res = ri2py(res)
-            return res
+    def getdim(self):
+        res = r.dim(self)
+        res = ri2py(res)
+        return res
 
-    def __setattr__(self, name, value):
-        if name == 'dim':
-            value = py2ro(value)
-            res = r["dim<-"](self, value)
+    def setdim(self, value):
+        value = py2ro(value)
+        res = r["dim<-"](self, value)
             #FIXME: not properly done
-            raise(Exception("Not yet implemented"))
+        raise(Exception("Not yet implemented"))
 
+    dim = property(getdim, setdim, 
+                   "Dimension of the array.")
+
     def getnames(self):
         """ Return a list of name vectors
         (like the R function 'dimnames' does it)."""
@@ -301,6 +303,7 @@
         res = r.dimnames(self)
         return res
         
+    names = property(getnames)
 
 
 class RMatrix(RArray):
@@ -317,25 +320,19 @@
         return self.dim[1]
 
 class RDataFrame(RVector):
-    def __init__(self, *args, **kwargs):
-
-        if len(args) > 1:
-            raise(ValueError("Only one unnamed parameter is allowed."))
-
-        if len(args) == 1:
-            if len(kwargs) != 0:
-                raise(ValueError("No named parameters allowed when there is an 
unnamed parameter."))
-            else:
-                super(RDataFrame, self).__init__(args[0])
+    def __init__(self, tlist):
+        if isinstance(tlist, rlc.TaggedList):
+            df = baseNameSpaceEnv["data.frame"].rcall(tlist.items())
+            super(RDataFrame, self).__init__(df)
+        elif isinstance(tlist, rinterface.SexpVector):
+            if tlist.typeof != rinterface.VECSXP:
+                raise ValueError("tlist should of typeof VECSXP")
+            super(RDataFrame, self).__init__(tlist)
         else:
-            if len(kwargs) == 0:
-                raise(ValueError("Initialization parameters needed."))
-            df = baseNameSpaceEnv["data.frame"](**kwargs)
-            super(RDataFrame, self).__init__(df)
-
-        #import pdb; pdb.set_trace()
-        if not baseNameSpaceEnv["is.data.frame"](self)[0]:
-            raise(TypeError("The object must be representing an R data.frame"))
+            raise ValueError("tlist can be either"+
+                             " an instance of rpy2.rlike.container.TaggedList" 
+
+                             " or an instance of rpy2.rinterface.SexpVector" +
+                             " of type VECSXP.")
     
     def nrow(self):
         """ Number of rows. 
@@ -426,14 +423,20 @@
         super(RFormula, self).__init__(robj)
         
     def getenvironment(self):
-        """ Return the R environment in which the formula will look for
-        its variables. """
         res = self.do_slot(".Environment")
         res = ri2py(res)
         return res
 
-    
+    def setenvironment(self, val):
+        if not isinstance(val, rinterface.SexpEnvironment):
+            raise ValueError("The environment must be an instance of" +
+                             " rpy2.rinterface.Sexp.environment")
+        self.do_slot_assign(".Environment", val)
 
+    environment = property(getenvironment, setenvironment,
+                           "R environment in which the formula will look for" +
+                           " its variables.")
+
     
 class R(object):
     _instance = None
@@ -461,7 +464,10 @@
 
     def __str__(self):
         s = super(R, self).__str__()
-        s += str(self["version"])
+        s += os.linesep
+        version = self["version"]
+        tmp = [n+': '+val[0] for n, val in itertools.izip(version.getnames(), 
version)]
+        s += str.join(os.linesep, tmp)
         return s
 
     def __call__(self, string):
@@ -473,4 +479,4 @@
 
 globalEnv = ri2py(rinterface.globalEnv)
 baseNameSpaceEnv = ri2py(rinterface.baseNameSpaceEnv)
-
+emptyEnv = ri2py(rinterface.emptyEnv)

Modified: branches/rpy_nextgen/rpy/robjects/tests/testRDataFrame.py
===================================================================
--- branches/rpy_nextgen/rpy/robjects/tests/testRDataFrame.py   2008-08-28 
07:19:07 UTC (rev 646)
+++ branches/rpy_nextgen/rpy/robjects/tests/testRDataFrame.py   2008-09-01 
15:34:09 UTC (rev 647)
@@ -1,6 +1,8 @@
 import unittest
 import rpy2.robjects as robjects
 rinterface = robjects.rinterface
+import rpy2.rlike.container as rlc
+
 import array
 
 class RDataFrameTestCase(unittest.TestCase):
@@ -8,14 +10,16 @@
     def testNew(self):
         letters = robjects.r.letters        
         numbers = robjects.r('1:26')
-        df = robjects.RDataFrame(letters=letters, numbers=numbers)
+        df = robjects.RDataFrame(rlc.TaggedList((letters, numbers),
+                                                tags = ('letters', 'numbers')))
 
         self.assertEquals("data.frame", df.rclass()[0])
 
     def testDim(self):
         letters = robjects.r.letters        
         numbers = robjects.r('1:26')
-        df = robjects.RDataFrame(letters=letters, numbers=numbers)
+        df = robjects.RDataFrame(rlc.TaggedList((letters, numbers),
+                                                tags = ('letters', 'numbers')))
 
         self.assertEquals(26, df.nrow())
         self.assertEquals(2, df.ncol())

Modified: branches/rpy_nextgen/rpy/robjects/tests/testRFormula.py
===================================================================
--- branches/rpy_nextgen/rpy/robjects/tests/testRFormula.py     2008-08-28 
07:19:07 UTC (rev 646)
+++ branches/rpy_nextgen/rpy/robjects/tests/testRFormula.py     2008-09-01 
15:34:09 UTC (rev 647)
@@ -13,6 +13,14 @@
         env = fml.getenvironment()
         self.assertEquals("environment", env.rclass()[0])
 
+    def testSetenvironment(self):
+        fml = robjects.RFormula("y ~ x")
+        newenv = robjects.baseNameSpaceEnv['new.env']()
+        env = fml.getenvironment()
+        self.assertFalse(newenv.rsame(env))
+        fml.setenvironment(newenv)
+        env = fml.getenvironment()
+        self.assertTrue(newenv.rsame(env))
 
 def suite():
     suite = unittest.TestLoader().loadTestsFromTestCase(RFormulaTestCase)


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
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to