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

Reply via email to