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