Revision: 455 http://rpy.svn.sourceforge.net/rpy/?rev=455&view=rev Author: lgautier Date: 2008-03-22 06:39:34 -0700 (Sat, 22 Mar 2008)
Log Message: ----------- - initialization of R now wrapped in a try/except - added method to assign items to an environment Modified Paths: -------------- branches/rpy_nextgen/rpy/rinterface/rinterface.c branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c =================================================================== --- branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-03-21 22:31:25 UTC (rev 454) +++ branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-03-22 13:39:34 UTC (rev 455) @@ -937,7 +937,6 @@ }; -//FIXME: segfault :/ static SexpObject* EnvironmentSexp_subscript(PyObject *self, PyObject *key) { @@ -969,10 +968,49 @@ Not all R environment are hash tables, and this may\ influence performances when doing repeated lookups."); +static int +EnvironmentSexp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) +{ + char *name; + + if (!PyString_Check(key)) { + PyErr_Format(PyExc_ValueError, "Keys must be string objects."); + return -1; + } + + int is_SexpObject = PyObject_TypeCheck(value, &Sexp_Type); + if (! is_SexpObject) { + PyErr_Format(PyExc_ValueError, + "All parameters must be of type Sexp_Type."); + //PyDecRef(value); + return -1; + } + + name = PyString_AsString(key); + + SEXP rho_R = ((SexpObject *)self)->sexp; + if (! rho_R) { + PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP."); + return -1; + } + + SEXP sexp_copy; + SEXP sexp = ((SexpObject *)value)->sexp; + if (! sexp) { + PyErr_Format(PyExc_ValueError, "The value has NULL SEXP."); + return -1; + } + SEXP sym = Rf_install(name); + PROTECT(sexp_copy = Rf_duplicate(sexp)); + Rf_defineVar(sym, sexp_copy, rho_R); + UNPROTECT(1); + return 0; +} + static PyMappingMethods EnvironmentSexp_mappignMethods = { 0, /* mp_length */ (binaryfunc)EnvironmentSexp_subscript, /* mp_subscript */ - 0 /* mp_ass_subscript */ + (objobjargproc)EnvironmentSexp_ass_subscript /* mp_ass_subscript */ }; //FIXME: write more doc - should the environments Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py 2008-03-21 22:31:25 UTC (rev 454) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py 2008-03-22 13:39:34 UTC (rev 455) @@ -1,8 +1,11 @@ import unittest import rpy2.rinterface as rinterface -#FIXME: can starting and stopping an embedded R be done several times ? -rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") +try: + #FIXME: can starting and stopping an embedded R be done several times ? + rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") +except: + pass class SexpEnvironmentTestCase(unittest.TestCase): #def setUpt(self): @@ -35,6 +38,13 @@ ok = isinstance(sfit_R, rinterface.SexpClosure) self.assertTrue(ok) + def testSubscript(self): + ge = rinterface.globalEnv + obj = rinterface.globalEnv.get("letters") + ge["a"] = obj + a = rinterface.globalEnv["a"] + self.assertTrue(False) #FIXME: write proper unit test here + def suite(): suite = unittest.TestLoader().loadTestsFromTestCase(SexpEnvironmentTestCase) return suite 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: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list