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