Revision: 509 http://rpy.svn.sourceforge.net/rpy/?rev=509&view=rev Author: lgautier Date: 2008-05-04 20:26:35 -0700 (Sun, 04 May 2008)
Log Message: ----------- rinterface: - modified the signature to initEmbeddedR - alias rinterface to ri for some tests - added comments in the C code robjects: - handling of named vectors (unstable) Modified Paths: -------------- branches/rpy_nextgen/doc/rpy.texi branches/rpy_nextgen/rpy/rinterface/rinterface.c branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVectorNumeric.py branches/rpy_nextgen/rpy/robjects/__init__.py branches/rpy_nextgen/rpy/robjects/tests/testRVector.py Modified: branches/rpy_nextgen/doc/rpy.texi =================================================================== --- branches/rpy_nextgen/doc/rpy.texi 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/doc/rpy.texi 2008-05-05 03:26:35 UTC (rev 509) @@ -9,9 +9,7 @@ * RPy v2: (rpy2). RPy2, Python extension module for R. @end direntry [EMAIL PROTECTED] version -2.0.0-dev [EMAIL PROTECTED] macro [EMAIL PROTECTED] VERSIONno 2.0.0-dev @macro Python Python @@ -33,9 +31,10 @@ @end macro @ifinfo -This file documents @RPy2{} @version{} +This file documents @RPy2{} @value{VERSIONno} -Copyright - +Copyright @copyright{} 2008 L.@: Gautier@ + Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @@ -110,8 +109,8 @@ @contents @end iftex [EMAIL PROTECTED] Preface, Overview, , Top [EMAIL PROTECTED] Preface [EMAIL PROTECTED] Preface, Overview, Top, Top [EMAIL PROTECTED] Preface This presentation describes @RPy2{}, a close-to-complete rewrite of the @RPy{} package. @@ -392,17 +391,18 @@ One has to initialize R before much can be done. The function @code{initEmbeddedR} lets one initialize -the embedded R, and take the same parameters as one -would give when starting an R terminal from the command -line: +the embedded R: @example ->>> rinterface.initEmbeddedR("--no-save", "--quiet") +>>> rinterface.initEmbeddedR() @end example Initialization should only be performed once and in the case of a second call to initEmbeddedR, to avoid unpredictable results when using the embedded R, an exception is be fired. +Parameters for the initialization are in the module varible [EMAIL PROTECTED] + @node Rspace @subsection @R{} space and @Python{} space Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c =================================================================== --- branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-05-05 03:26:35 UTC (rev 509) @@ -79,6 +79,16 @@ typedef intobjargproc ssizeobjargproc; #endif +/* A sequence that holds options to initialize R */ +static PyObject *initOptions; + +/* Helper variables to quickly resolve SEXP types. + * The first variable gives the highest possible + * SEXP type. + * The second in an array of strings giving either + * the SEXP name (INTSXP, REALSXP, etc...), or a NULL + * if there is no such valid SEXP. + */ static const int maxValidSexpType = 99; static char **validSexpType; @@ -96,6 +106,9 @@ error("Interrupted"); } +/* Helper variable to store whether the embedded R is initialized + * or not. + */ static PyObject *embeddedR_isInitialized; /* The Python original SIGINT handler */ @@ -123,7 +136,7 @@ /* Should having multiple threads of R become possible, * useful routines could appear here... */ -static PyObject* EmbeddedR_init(PyObject *self, PyObject *args) +static PyObject* EmbeddedR_init(PyObject *self) { if (PyObject_IsTrue(embeddedR_isInitialized)) { @@ -131,18 +144,14 @@ return NULL; } - const Py_ssize_t n_args = PyTuple_Size(args); - //char *defaultargv[] = {"rpython", "--verbose"}; + const Py_ssize_t n_args = PySequence_Size(initOptions); char *options[n_args]; + PyObject *opt_string; Py_ssize_t ii; for (ii = 0; ii < n_args; ii++) { - opt_string = PyTuple_GetItem(args, ii); - if (! PyString_Check(opt_string)) { - PyErr_SetString(PyExc_TypeError, "All options must be strings."); - return NULL; - } - options[ii] = PyString_AS_STRING(opt_string); + opt_string = PyList_GetItem(initOptions, ii); + options[ii] = PyString_AsString(opt_string); } int status = Rf_initEmbeddedR(n_args, options); @@ -155,12 +164,16 @@ PyObject *res = PyInt_FromLong(status); +#ifdef RPY_VERBOSE + printf("R initialized - status: %i\n", status); +#endif + return res; } PyDoc_STRVAR(EmbeddedR_init_doc, "initEmbeddedR()\n\ -\n\ -Initialize an embedded R."); + \n\ + Initialize an embedded R."); static PyObject* EmbeddedR_end(PyObject *self, Py_ssize_t fatal) @@ -192,8 +205,8 @@ } PyDoc_STRVAR(EmbeddedR_end_doc, "endEmbeddedR()\n\ -\n\ -Terminate an embedded R."); + \n\ + Terminate an embedded R."); /* --- set output from the R console ---*/ @@ -225,8 +238,8 @@ } PyDoc_STRVAR(EmbeddedR_setWriteConsole_doc, "setWriteConsoleEmbeddedR()\n\ -\n\ -Set the R console output to the Python console."); + \n\ + Set the R console output to the Python console."); static PyObject* @@ -256,7 +269,7 @@ if ((RPY_COUNT(self) == 0) && RPY_SEXP(self)) { #ifdef RPY_VERBOSE - printf("freeing SEXP resources..."); + printf("freeing SEXP resources...\n"); #endif if (RPY_SEXP(self) != R_NilValue) { @@ -277,10 +290,10 @@ { //FIXME: make sure this is making any sense SEXP sexp = RPY_SEXP((PySexpObject *)self); - if (! sexp) { - PyErr_Format(PyExc_ValueError, "NULL SEXP."); - return NULL; - } + //if (! sexp) { + // PyErr_Format(PyExc_ValueError, "NULL SEXP."); + // return NULL; + //} return PyString_FromFormat("<%s - Python:\%p / R:\%p>", self->ob_type->tp_name, self, @@ -299,8 +312,8 @@ return PyInt_FromLong(TYPEOF(sexp)); } PyDoc_STRVAR(Sexp_typeof_doc, -"\n\ -Returns the R internal SEXPREC type."); + "\n\ + Returns the R internal SEXPREC type."); static PyObject* @@ -421,11 +434,15 @@ PySexpObject *self; #ifdef RPY_VERBOSE - printf("new object @ %p...", self); + printf("new object @...\n"); #endif //self = (PySexpObject *)_PyObject_New(&type); self = (PySexpObject *)type->tp_alloc(type, 0); + #ifdef RPY_VERBOSE + printf(" %p...\n", self); + #endif + if (! self) PyErr_NoMemory(); @@ -449,7 +466,7 @@ Sexp_init(PySexpObject *self, PyObject *args, PyObject *kwds) { #ifdef RPY_VERBOSE - printf("%p: Sexp initializing...", self); + printf("%p: Sexp initializing...\n", self); #endif PyObject *sourceObject; @@ -662,6 +679,12 @@ /* return NULL; */ /* } */ UNPROTECT(2); + + if (! res_R) { + PyErr_Format(PyExc_RuntimeError, "Error while running R code"); + return NULL; + } + //FIXME: standardize R outputs extern void Rf_PrintWarnings(void); Rf_PrintWarnings(); /* show any warning messages */ @@ -670,7 +693,6 @@ return res; fail: - printf("failed.\n"); UNPROTECT(1); return NULL; @@ -972,14 +994,13 @@ //FIXME: write more doc PyDoc_STRVAR(VectorSexp_Type_doc, -"R object that is a vector.\ - R vectors start their indexing at one,\ - while Python lists or arrays start indexing\ - at zero.\ -\n\ -In the hope to avoid confusion, the indexing\ - from the Python subset operator (__getitem__)\ - is done at zero."); + "R object that is a vector." + " R vectors start their indexing at one," + " while Python lists or arrays start indexing" + " at zero.\n" + "In the hope to avoid confusion, the indexing" + " from the Python subset operator (__getitem__)" + " is done at zero."); /* ", while an other method to perform\ */ /* it at one is provided (_not yet implemented_).\ */ /* That other method is also performing indexing."); */ @@ -1040,7 +1061,7 @@ VectorSexp_init(PySexpObject *self, PyObject *args, PyObject *kwds) { #ifdef RPY_VERBOSE - printf("%p: VectorSexp initializing...", self); + printf("%p: VectorSexp initializing...\n", self); #endif PyObject *object; @@ -1156,9 +1177,9 @@ return NULL; } PyDoc_STRVAR(EnvironmentSexp_subscript_doc, - "Find an R object in the environment.\n\ - Not all R environment are hash tables, and this may\ - influence performances when doing repeated lookups."); + "Find an R object in the environment.\n" + "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) @@ -1624,7 +1645,7 @@ /* --- List of functions defined in the module --- */ static PyMethodDef EmbeddedR_methods[] = { - {"initEmbeddedR", (PyCFunction)EmbeddedR_init, METH_VARARGS, + {"initEmbeddedR", (PyCFunction)EmbeddedR_init, METH_NOARGS, EmbeddedR_init_doc}, {"endEmbeddedR", (PyCFunction)EmbeddedR_end, METH_O, EmbeddedR_end_doc}, @@ -1746,8 +1767,9 @@ PyModule_AddIntConstant(module, #name, name) #define ADD_VALID_SEXP(name) \ validSexpType[name] = #name +#define PYASSERT_ZERO(code) \ + if ((code) != 0) {return ; } - PyMODINIT_FUNC initrinterface(void) { @@ -1772,6 +1794,25 @@ return; d = PyModule_GetDict(m); + initOptions = PyList_New(4); + PYASSERT_ZERO( + PyList_SetItem(initOptions, 0, + PyString_FromString("rpy2")) + ); + PYASSERT_ZERO( + PyList_SetItem(initOptions, 1, + PyString_FromString("--quiet")) + ); + PYASSERT_ZERO( + PyList_SetItem(initOptions, 2, + PyString_FromString("--vanilla")) + ); + PYASSERT_ZERO( + PyList_SetItem(initOptions, 3, + PyString_FromString("--no-save")) + ); + PyModule_AddObject(m, "initOptions", initOptions); + PyModule_AddObject(m, "Sexp", (PyObject *)&Sexp_Type); PyModule_AddObject(m, "SexpClosure", (PyObject *)&ClosureSexp_Type); PyModule_AddObject(m, "SexpVector", (PyObject *)&VectorSexp_Type); Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_Sexp.py 2008-05-05 03:26:35 UTC (rev 509) @@ -3,7 +3,7 @@ try: #FIXME: can starting and stopping an embedded R be done several times ? - rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") + rinterface.initEmbeddedR() except: pass Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpClosure.py 2008-05-05 03:26:35 UTC (rev 509) @@ -3,7 +3,7 @@ try: #FIXME: can starting and stopping an embedded R be done several times ? - rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") + rinterface.initEmbeddedR() except: pass Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py 2008-05-05 03:26:35 UTC (rev 509) @@ -3,7 +3,7 @@ try: #FIXME: can starting and stopping an embedded R be done several times ? - rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") + rinterface.initEmbeddedR() except: pass Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVector.py 2008-05-05 03:26:35 UTC (rev 509) @@ -1,10 +1,10 @@ import unittest import sys -import rpy2.rinterface as rinterface +import rpy2.rinterface as ri try: #FIXME: can starting and stopping an embedded R be done several times ? - rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") + ri.initEmbeddedR() except: pass @@ -13,74 +13,74 @@ class SexpVectorTestCase(unittest.TestCase): #def setUpt(self): - # rinterface.initEmbeddedR("foo", "--no-save") + # ri.initEmbeddedR("foo", "--no-save") #def tearDown(self): - # rinterface.endEmbeddedR(1); + # ri.endEmbeddedR(1); def testMissinfType(self): - self.assertRaises(ValueError, rinterface.SexpVector, [2, ]) + self.assertRaises(ValueError, ri.SexpVector, [2, ]) def testNewBool(self): - sexp = rinterface.SexpVector([True, ], rinterface.LGLSXP) - isLogical = rinterface.globalEnv.get("is.logical") + sexp = ri.SexpVector([True, ], ri.LGLSXP) + isLogical = ri.globalEnv.get("is.logical") ok = isLogical(sexp)[0] self.assertTrue(ok) self.assertTrue(sexp[0]) - sexp = rinterface.SexpVector(["a", ], rinterface.LGLSXP) - isLogical = rinterface.globalEnv.get("is.logical") + sexp = ri.SexpVector(["a", ], ri.LGLSXP) + isLogical = ri.globalEnv.get("is.logical") ok = isLogical(sexp)[0] self.assertTrue(ok) self.assertTrue(sexp[0]) def testNewInt(self): - sexp = rinterface.SexpVector([1, ], rinterface.INTSXP) - isInteger = rinterface.globalEnv.get("is.integer") + sexp = ri.SexpVector([1, ], ri.INTSXP) + isInteger = ri.globalEnv.get("is.integer") ok = isInteger(sexp)[0] self.assertTrue(ok) - sexp = rinterface.SexpVector(["a", ], rinterface.INTSXP) - isNA = rinterface.globalEnv.get("is.na") + sexp = ri.SexpVector(["a", ], ri.INTSXP) + isNA = ri.globalEnv.get("is.na") ok = isNA(sexp)[0] self.assertTrue(ok) def testNewReal(self): - sexp = rinterface.SexpVector([1.0, ], rinterface.REALSXP) - isNumeric = rinterface.globalEnv.get("is.numeric") + sexp = ri.SexpVector([1.0, ], ri.REALSXP) + isNumeric = ri.globalEnv.get("is.numeric") ok = isNumeric(sexp)[0] self.assertTrue(ok) - sexp = rinterface.SexpVector(["a", ], rinterface.REALSXP) - isNA = rinterface.globalEnv.get("is.na") + sexp = ri.SexpVector(["a", ], ri.REALSXP) + isNA = ri.globalEnv.get("is.na") ok = isNA(sexp)[0] self.assertTrue(ok) def testNewComplex(self): - sexp = rinterface.SexpVector([1.0 + 1.0j, ], rinterface.CPLXSXP) - isComplex = rinterface.globalEnv.get("is.complex") + sexp = ri.SexpVector([1.0 + 1.0j, ], ri.CPLXSXP) + isComplex = ri.globalEnv.get("is.complex") ok = isComplex(sexp)[0] self.assertTrue(ok) def testNewString(self): - sexp = rinterface.SexpVector(["abc", ], rinterface.STRSXP) - isCharacter = rinterface.globalEnv.get("is.character") + sexp = ri.SexpVector(["abc", ], ri.STRSXP) + isCharacter = ri.globalEnv.get("is.character") ok = isCharacter(sexp)[0] self.assertTrue(ok) - sexp = rinterface.SexpVector([1, ], rinterface.STRSXP) - isCharacter = rinterface.globalEnv.get("is.character") + sexp = ri.SexpVector([1, ], ri.STRSXP) + isCharacter = ri.globalEnv.get("is.character") ok = isCharacter(sexp)[0] self.assertTrue(ok) def testNewVector(self): - sexp_char = rinterface.SexpVector(["abc", ], - rinterface.STRSXP) - sexp_int = rinterface.SexpVector([1, ], - rinterface.INTSXP) - sexp = rinterface.SexpVector([sexp_char, sexp_int], - rinterface.VECSXP) - isList = rinterface.globalEnv.get("is.list") + sexp_char = ri.SexpVector(["abc", ], + ri.STRSXP) + sexp_int = ri.SexpVector([1, ], + ri.INTSXP) + sexp = ri.SexpVector([sexp_char, sexp_int], + ri.VECSXP) + isList = ri.globalEnv.get("is.list") ok = isList(sexp)[0] self.assertTrue(ok) @@ -88,109 +88,110 @@ def testNew_InvalidType(self): - self.assertRaises(ValueError, rinterface.SexpVector, [1, ], -1) - self.assertRaises(ValueError, rinterface.SexpVector, [1, ], 250) + self.assertRaises(ValueError, ri.SexpVector, [1, ], -1) + self.assertRaises(ValueError, ri.SexpVector, [1, ], 250) def testGetItem(self): - letters_R = rinterface.globalEnv.get("letters") - self.assertTrue(isinstance(letters_R, rinterface.SexpVector)) + letters_R = ri.globalEnv.get("letters") + self.assertTrue(isinstance(letters_R, ri.SexpVector)) letters = (('a', 0), ('b', 1), ('c', 2), ('x', 23), ('y', 24), ('z', 25)) for l, i in letters: self.assertTrue(letters_R[i] == l) - Rlist = rinterface.globalEnv.get("list") - seq_R = rinterface.globalEnv.get("seq") + Rlist = ri.globalEnv.get("list") + seq_R = ri.globalEnv.get("seq") - mySeq = seq_R(rinterface.SexpVector([0, ], rinterface.INTSXP), - rinterface.SexpVector([10, ], rinterface.INTSXP)) + mySeq = seq_R(ri.SexpVector([0, ], ri.INTSXP), + ri.SexpVector([10, ], ri.INTSXP)) myList = Rlist(s=mySeq, l=letters_R) - idem = rinterface.globalEnv.get("identical") + idem = ri.globalEnv.get("identical") self.assertTrue(idem(mySeq, myList[0])) self.assertTrue(idem(letters_R, myList[1])) def testGetItemOutOfBound(self): - myVec = rinterface.SexpVector([0, 1, 2, 3, 4, 5], rinterface.INTSXP) + myVec = ri.SexpVector([0, 1, 2, 3, 4, 5], ri.INTSXP) self.assertRaises(IndexError, myVec.__getitem__, 10) - if (sys.maxint > rinterface.R_LEN_T_MAX): + if (sys.maxint > ri.R_LEN_T_MAX): self.assertRaises(IndexError, myVec.__getitem__, - rinterface.R_LEN_T_MAX+1) + ri.R_LEN_T_MAX+1) def testAssignItemDifferentType(self): - c_R = rinterface.globalEnv.get("c") - myVec = c_R(rinterface.SexpVector([0, 1, 2, 3, 4, 5], rinterface.INTSXP)) + c_R = ri.globalEnv.get("c") + myVec = c_R(ri.SexpVector([0, 1, 2, 3, 4, 5], ri.INTSXP)) #import pdb; pdb.set_trace() self.assertRaises(ValueError, myVec.__setitem__, 0, - rinterface.SexpVector(["a", ], rinterface.STRSXP)) + ri.SexpVector(["a", ], ri.STRSXP)) def testAssignItemOutOfBound(self): - c_R = rinterface.globalEnv.get("c") - myVec = c_R(rinterface.SexpVector([0, 1, 2, 3, 4, 5], rinterface.INTSXP)) + c_R = ri.globalEnv.get("c") + myVec = c_R(ri.SexpVector([0, 1, 2, 3, 4, 5], ri.INTSXP)) self.assertRaises(IndexError, myVec.__setitem__, 10, - rinterface.SexpVector([1, ], rinterface.INTSXP)) + ri.SexpVector([1, ], ri.INTSXP)) def testAssignItemInt(self): - c_R = rinterface.globalEnv.get("c") - myVec = c_R(rinterface.SexpVector([0, 1, 2, 3, 4, 5], rinterface.INTSXP)) - myVec[0] = rinterface.SexpVector([100, ], rinterface.INTSXP) + c_R = ri.globalEnv.get("c") + myVec = c_R(ri.SexpVector([0, 1, 2, 3, 4, 5], ri.INTSXP)) + myVec[0] = ri.SexpVector([100, ], ri.INTSXP) self.assertTrue(myVec[0] == 100) - myVec[3] = rinterface.SexpVector([100, ], rinterface.INTSXP) + myVec[3] = ri.SexpVector([100, ], ri.INTSXP) self.assertTrue(myVec[3] == 100) def testAssignItemReal(self): - c_R = rinterface.globalEnv.get("c") - myVec = c_R(rinterface.SexpVector([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], - rinterface.REALSXP)) - myVec[0] = rinterface.SexpVector([100.0, ], rinterface.REALSXP) + c_R = ri.globalEnv.get("c") + myVec = c_R(ri.SexpVector([0.0, 1.0, 2.0, 3.0, 4.0, 5.0], + ri.REALSXP)) + myVec[0] = ri.SexpVector([100.0, ], ri.REALSXP) self.assertTrue(floatEqual(myVec[0], 100.0)) - myVec[3] = rinterface.SexpVector([100.0, ], rinterface.REALSXP) + myVec[3] = ri.SexpVector([100.0, ], ri.REALSXP) self.assertTrue(floatEqual(myVec[3], 100.0)) def testAssignItemLogical(self): - c_R = rinterface.globalEnv.get("c") - myVec = c_R(rinterface.SexpVector([True, False, True, True, False], - rinterface.LGLSXP)) - myVec[0] = rinterface.SexpVector([False, ], rinterface.LGLSXP) + c_R = ri.globalEnv.get("c") + myVec = c_R(ri.SexpVector([True, False, True, True, False], + ri.LGLSXP)) + myVec[0] = ri.SexpVector([False, ], ri.LGLSXP) self.assertFalse(myVec[0]) - myVec[3] = rinterface.SexpVector([False, ], rinterface.LGLSXP) + myVec[3] = ri.SexpVector([False, ], ri.LGLSXP) self.assertFalse(myVec[3]) def testAssignItemComplex(self): - c_R = rinterface.globalEnv.get("c") - myVec = c_R(rinterface.SexpVector([1.0+2.0j, 2.0+2.0j, 3.0+2.0j, 4.0+2.0j, 5.0+2.0j], - rinterface.CPLXSXP)) - myVec[0] = rinterface.SexpVector([100.0+200.0j, ], rinterface.CPLXSXP) + c_R = ri.globalEnv.get("c") + myVec = c_R(ri.SexpVector([1.0+2.0j, 2.0+2.0j, 3.0+2.0j, 4.0+2.0j, 5.0+2.0j], + ri.CPLXSXP)) + myVec[0] = ri.SexpVector([100.0+200.0j, ], ri.CPLXSXP) self.assertTrue(floatEqual(myVec[0].real, 100.0)) self.assertTrue(floatEqual(myVec[0].imag, 200.0)) - myVec[3] = rinterface.SexpVector([100.0+200.0j, ], rinterface.CPLXSXP) + myVec[3] = ri.SexpVector([100.0+200.0j, ], ri.CPLXSXP) self.assertTrue(floatEqual(myVec[3].real, 100.0)) self.assertTrue(floatEqual(myVec[3].imag, 200.0)) def testAssignItemList(self): - myVec = rinterface.SexpVector([rinterface.SexpVector(["a", ], rinterface.STRSXP), - rinterface.SexpVector([1, ], rinterface.INTSXP), - rinterface.SexpVector([3, ], rinterface.INTSXP)], - rinterface.VECSXP) + myVec = ri.SexpVector([ri.SexpVector(["a", ], ri.STRSXP), + ri.SexpVector([1, ], ri.INTSXP), + ri.SexpVector([3, ], ri.INTSXP)], + ri.VECSXP) - myVec[0] = rinterface.SexpVector([rinterface.SexpVector([100.0, ], rinterface.REALSXP), ], - rinterface.VECSXP) + myVec[0] = ri.SexpVector([ri.SexpVector([100.0, ], +ri.REALSXP), ], + ri.VECSXP) self.assertTrue(floatEqual(myVec[0][0][0], 100.0)) - myVec[2] = rinterface.SexpVector([rinterface.SexpVector(["a", ], rinterface.STRSXP), ], - rinterface.VECSXP) + myVec[2] = ri.SexpVector([ri.SexpVector(["a", ], ri.STRSXP), ], + ri.VECSXP) self.assertTrue(myVec[2][0][0] == "a") def testAssignItemString(self): - letters_R = rinterface.SexpVector("abcdefghij", rinterface.STRSXP) - self.assertRaises(ValueError, letters_R.__setitem__, 0, rinterface.SexpVector([1, ], - rinterface.INTSXP)) + letters_R = ri.SexpVector("abcdefghij", ri.STRSXP) + self.assertRaises(ValueError, letters_R.__setitem__, 0, ri.SexpVector([1, ], + ri.INTSXP)) - letters_R[0] = rinterface.SexpVector(["z", ], rinterface.STRSXP) + letters_R[0] = ri.SexpVector(["z", ], ri.STRSXP) self.assertTrue(letters_R[0] == "z") def suite(): Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVectorNumeric.py =================================================================== --- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVectorNumeric.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpVectorNumeric.py 2008-05-05 03:26:35 UTC (rev 509) @@ -6,7 +6,7 @@ try: #FIXME: can starting and stopping an embedded R be done several times ? - rinterface.initEmbeddedR("foo", "--vanilla", "--no-save", "--quiet") + rinterface.initEmbeddedR() except: pass Modified: branches/rpy_nextgen/rpy/robjects/__init__.py =================================================================== --- branches/rpy_nextgen/rpy/robjects/__init__.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/robjects/__init__.py 2008-05-05 03:26:35 UTC (rev 509) @@ -77,13 +77,13 @@ self._sexp = rinterface.Sexp(sexp, copy=copy) def __str__(self): - tmp = r.fifo("") - r.sink(tmp) + tmp = baseNameSpaceEnv["fifo"]("") + baseNameSpaceEnv["sink"](tmp) r.show(self) - r.sink() - s = r.readLines(tmp) + baseNameSpaceEnv["sink"]() + s = baseNameSpaceEnv["readLines"](tmp) r.close(tmp) - s = str.join(os.linesep, self) + s = str.join(os.linesep, s) return s def __repr__(self): @@ -181,8 +181,13 @@ def __len__(self): return len(self.getSexp()) + def getNames(self): + res = r.names(self.getSexp()) + import pdb; pdb.set_trace() + return res + class RArray(Rvector): - + """ An R array """ def __init__(self, o): super(RArray, self).__init__(o) if not r["is.array"](self.getSexp())[0]: @@ -199,20 +204,25 @@ value = mapperPy2R res = r["dim<-"](value) + class RMatrix(RArray): - + """ An R matrix """ + def nrow(self): """ Number of rows """ - return r.nrow(self.getSexp()) + return self.dim[0] def ncol(self): """ Number of columns """ - return r.nrow(self.getSexp()) + return self.dim[1] class DataFrame(Rvector): #FIXME: not implemented def __init__(self, o): - raise(RuntimeError("Not implemented.")) + if not isinstance(o, rinterface.SexpVector): + o = mapperPy2R(o) + o = o.getSexp() + self._sexp = o @@ -276,10 +286,9 @@ class R(object): _instance = None - def __init__(self, options): + def __init__(self): if R._instance is None: - args = ["robjects", ] + options - rinterface.initEmbeddedR(*args) + rinterface.initEmbeddedR() R._instance = self else: raise(ValueError("Only one instance of R can be created")) @@ -307,7 +316,7 @@ res = self.eval(p) return res -r = R(["--no-save", "--quiet"]) +r = R() globalEnv = mapperR2Py(rinterface.globalEnv) baseNameSpaceEnv = mapperR2Py(rinterface.baseNameSpaceEnv) Modified: branches/rpy_nextgen/rpy/robjects/tests/testRVector.py =================================================================== --- branches/rpy_nextgen/rpy/robjects/tests/testRVector.py 2008-04-29 09:03:05 UTC (rev 508) +++ branches/rpy_nextgen/rpy/robjects/tests/testRVector.py 2008-05-05 03:26:35 UTC (rev 509) @@ -1,25 +1,25 @@ import unittest import rpy2.robjects as robjects -rinterface = robjects.rinterface +ri = robjects.rinterface import array rlist = robjects.baseNameSpaceEnv["list"] class RvectorTestCase(unittest.TestCase): def testNew(self): - identical = rinterface.baseNameSpaceEnv["identical"] + identical = ri.baseNameSpaceEnv["identical"] py_a = array.array('i', [1,2,3]) ro_v = robjects.Rvector(py_a) - self.assertEquals(ro_v.typeof(), rinterface.INTSXP) + self.assertEquals(ro_v.typeof(), ri.INTSXP) - ri_v = rinterface.SexpVector(py_a, rinterface.INTSXP) + ri_v = ri.SexpVector(py_a, ri.INTSXP) ro_v = robjects.Rvector(ri_v) self.assertTrue(identical(ro_v._sexp, ri_v)[0]) #FIXME: why isn't this working ? #del(ri_v) - self.assertEquals(rinterface.INTSXP, ro_v.typeof()) + self.assertEquals(ri.INTSXP, ro_v.typeof()) def testOperators(self): seq_R = robjects.r["seq"] @@ -67,6 +67,16 @@ self.assertTrue(idem(letters, mylist[0])) self.assertTrue(idem("foo", mylist[1])) + def testGetNames(self): + vec = robjects.Rvector(array.array('i', [1,2,3])) + v_names = [robjects.baseNameSpaceEnv["letters"][x] for x in (0,1,2)] + #FIXME: simplify this + r_names = robjects.baseNameSpaceEnv["c"](*v_names) + robjects.r["names<-"](vec, r_names) + + for i in xrange(len(vec)): + self.assertEquals(v_names[i], vec.getNames()[i]) + def suite(): suite = unittest.TestLoader().loadTestsFromTestCase(RvectorTestCase) 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 the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list