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