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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list