Laurent Gautier wrote:
> Peter wrote:
>> On Wed, Sep 30, 2009 at 4:59 PM, Laurent Gautier <lgaut...@gmail.com> 
>> wrote:
>>> Peter wrote:
>>>> Can you do something like check if example_name is a valid argument
>>>> for the function at run time, and if not, check example.name instead?
>>>> Would this impose too high a performance cost?
>>>>
>>>> I agree this won't cover the special case of a function which has
>>>> two arguments which differ only in underscore vs dot, but that is
>>>> very rare corner case (surely)?
>>> I welcome all proposal, but I'd like to keep users on the safe side by
>>> default as much as possible (starting with "it should not happen... 
>>> most of
>>> the time" does not seem like the right way to start).
>>
>> I see your point, but it should be balanced against the desire to make
>> rpy2 easy to use, especially for those of us used to the "." / "_" 
>> mapping
>> from rpy1.
>>
>> Ideally I'd like rpy2 to map "arg_name" (in Python code) to either
>> "arg_name" or "arg.name" (when talking to R) as appropriate for
>> the function concerned, but raise an error if both possibilities are
>> defined. That way I continue to use the simple substitution when
>> writing R calls, and only have to worry about these very rare corner
>> cases when due to ambiguity the naive way should raise an exception.
>> I don't know enough about R's introspection to say if this idea is
>> realistic or not.

The thread was useful, and lead to improvements.

rpy2-2.1dev now has a sort-of-cached conversion
mechanism (minimizing the hit of performance that converting at each 
call would have). Moreover the caching is safe, as it will throw an 
exception in the function has a signature that cannot be translated safely.

http://rpy.sourceforge.net/rpy2/doc-dev/html/robjects.html#functions



L.




>> Peter
> 
> 
> rpy2.robjects.packages.importr() (in rpy2-2.1-dev) is trying to address 
> something similar with object names by performing a check at import time 
> (and binding R object Python symbols, saving on the cost from 
> translating "." to "_" each time).
> 
> Having a somewhat similar approach with function signatures is on the 
> (unwritten but ever growing) to-do list. The method 
> robjects.Function.formals() can help making it possible and look like 
> follows (this is a simple example; it would be nice(r) to have the 
> function returned an instance of a subclass of rpy2.robjects.Function):
> 
> 
> def param_translate(rfunc):
>     """ Take an R rpy2.robjects.Function and
>     return the same function with its argument names with the
>     character '.' replaced with '_' whenever present """
> 
>     prm_translate = {}
>     for r_param in myrfunc.formals().names:
>         py_param = r_param.replace('.', '_')
>         if py_param in prm_translate:
>             raise ValueError("Error '%s' already in the transalation 
> table" %r_param)
> 
>         prm_translate[py_param] = r_param
> 
>     def f(*args, **kwargs):
>         for k in tuple(kwargs.keys()):
>             v = kwargs.pop(k)
>             kwargs[prm_translate[k]] = v
>         return rfunc(*args, **kwargs)
> 
>     return f
> 
> 
> # example with the method "unlist"
> 
>  >>> unlist = param_translate(robjects.baseenv['unlist'])
> 
> # Inspect the translation dict
> 
>  >>> unlist.__closure__[1].cell_contents
> {'recursive': 'recursive', 'use_names': 'use.names', 'x': 'x'}
> 
> 
> 
> 
> L.
> 
> 
> 
> 


------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
rpy-list mailing list
rpy-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpy-list

Reply via email to