It will likely return something inaccurate with the following
import rpy2.robjects as ro my_list = ro.r('list(a=1, b=2, a="a", c=3, a=TRUE)') L. Jon Olav Vik wrote: > I have had great use of rpy2, especially with the rnumpy and ipy_rnumpy > wrappers. One useful feature of rnumpy [1] is autoconversion from Python to R > objects, which will also deal with nested lists/dicts. > > Is there an equally convenient way of getting a Python dict or list out of an > R > list, possibly nested? Consider this example: > > from rnumpy import * > d = dict(i=123, x=0.25, s="test", nested=dict(j=456, t="nested list")) > r["y"] = rcopy(d) > r.str(r.y) > > The output is: > List of 4 > $ i : int 123 > $ x : num 0.25 > $ s : chr "test" > $ nested:List of 2 > ..$ j: int 456 > ..$ t: chr "nested list" > > Here, r.y is of <class 'rnumpy.RWrapper'>, whereas I would like to have the > output as a native Python object. (In my actual use case, r.y would be the > output of some R function, rather than corresponding to an existing Python > dict > 8-) > > The best I've been able to do is recurse through the names() of the R list, > see > code at end. It works for my simple example, but I'm not sure if it will work > with more complicated structures. Comments are welcome. > > Thank you in advance for any help. > Best regards, > Jon Olav Vik > > [1] http://bitbucket.org/njs/rnumpy/wiki/Home > "More natural/smarter passing of Python objects to R (Python dicts map to R > lists, Python lists have their contents autodetected and are mapped to > boolean/ > integral/numeric/character/list types as appropriate, numpy arrays are mapped > correctly by default, etc.)" > > > Here's the code. (Replace ¤¤¤ with >>> to make the doctests work...I'm > posting > from Gmane, which believes >>> means top-posting.) > > def rlist2pydict(x): > """ > Convert an R named list to a Python dict, recursively. > > Example: > ¤¤¤ from rnumpy import * > ¤¤¤ d = dict(i=123, x=0.25, s="test", nested=dict(j=456, t="nested list")) > ¤¤¤ r["y"] = rcopy(d) > ¤¤¤ r.str(r.y) # the "NULL" at the end is because str() returns nothing > List of 4 > $ i : int 123 > $ x : num 0.25 > $ s : chr "test" > $ nested:List of 2 > ..$ j: int 456 > ..$ t: chr "nested list" > NULL > ¤¤¤ rlist2pydict(r.y) == d > True > """ > xnames = r.names(x) > if r.is_null(xnames): > return x[0] if len(x) == 1 else list(x) > else: > return dict((k, rlist2pydict(r.dollar(x, k))) for k in xnames) > > > > ------------------------------------------------------------------------------ > _______________________________________________ > rpy-list mailing list > rpy-list@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rpy-list ------------------------------------------------------------------------------ _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list