[Rd] question

Patrick Burns pburns at pburns.seanet.com
Sat Mar 7 18:19:43 CET 2009


One idea of program design is that users
should be protected against themselves.

It is my experience that users, especially
novices, tend to over-split items rather than
over-clump items.  The fact that items are
returned by the same function call would
argue to me that there is a connection between
the items.


Patrick Burns
patrick at burns-stat.com
+44 (0)20 8525 0696
http://www.burns-stat.com
(home of "The R Inferno" and "A Guide for the Unwilling S User")

ivo welch wrote:
> hi gabor:  this would be difficult to do.  I don't think you want to
> read my programs.  it would give you an appreciation of what ugly
> horror programs end users can write in the beautiful R language  ;-).
>
> clearly, one can work around the lack of such a feature.
> multiple-return values are syntax sugar.  but maybe it helps to
> explain how I got to my own view.  I had to send an R program to
> someone who had never used it before.  without knowing R, he could
> literally read the entire program.  the only thing that stumped him
> was the multiple return values.  In my program, he saw
>
>   f= function() { return(list(a=myvector1, b=myvector2)) }
>
>   result=f()
>   a= result$a
>   b= result$a
>   rm(result)
>
> I had picked this method up over the years reading r-help.  of course,
> I had 10 return values, not two, each return value with its own long
> name.  I think it would have been a whole lot nicer if I could have
> written FOR HIM simply
>
>   f= function() { return(myvector1,myvector2); }
>   (a,b)= f()
>
> again, its syntax sugar.  I would find such syntax a whole lot more
> appealing.  and I often write functions that pass back a main program,
> but also some debug or other information.  maybe I am the only one...
>
> regards,
>
> /iaw
>
>
> On Sat, Mar 7, 2009 at 9:28 AM, Gabor Grothendieck
> <ggrothendieck at gmail.com> wrote:
>   
>> Why?   Can you demonstrate any situations where its useful?  Despite
>> having my own facility for this I've found that over the years I
>> have never used it.
>>
>> On Sat, Mar 7, 2009 at 9:23 AM,  <ivowel at gmail.com> wrote:
>>     
>>> Gentlemen---these are all very clever workarounds, but please forgive me for
>>> voicing my own opinion: IMHO, returning multiple values in a statistical
>>> language should really be part of the language itself. there should be a
>>> standard syntax of some sort, whatever it may be, that everyone should be
>>> able to use and which easily transfers from one local computer to another.
>>> It should not rely on clever hacks in the .Rprofile that are different from
>>> user to user, and which leave a reader of end user R code baffled at first
>>> by all the magic that is going on. Even the R tutorials for beginners should
>>> show a multiple-value return example right at the point where function calls
>>> and return values are first explained.
>>>
>>> I really do not understand why the earlier implementation of "multiple-value
>>> returns" was deprecated. then again, I am a naive end user, not a computer
>>> language expert. I probably would not even understand the nuances of syntax
>>> ambiguities that may have arisen. (this is my shortcoming.)
>>>
>>> regards,
>>>
>>> /iaw
>>>
>>>
>>> On Mar 7, 2009 4:34am, Wacek Kusnierczyk
>>> <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no> wrote:
>>>       
>>>> Mark.Bravington at csiro.au wrote:
>>>>
>>>>         
>>>>>> The syntax for returning multiple arguments does not strike me as
>>>>>>             
>>>>>> particularly appealing.  would it not possible to allow syntax like:
>>>>>>             
>>>>>>   f= function() { return( rnorm(10), rnorm(20) ) }
>>>>>>             
>>>>>>   (a,d$b) = f()
>>>>>>             
>>>>> FWIW, my own solution is to define a "multi-assign operator":
>>>>>           
>>>>> '%
>>>>>   # a must be of the form '{thing1;thing2;...}'
>>>>>           
>>>>>   a
>>>>>   e
>>>>>   stopifnot( length( b) == length( a))
>>>>>           
>>>>>   for( i in seq_along( a))
>>>>>           
>>>>>     eval( call( '
>>>>>   NULL
>>>>>           
>>>>> }
>>>>>           
>>>>
>>>> you might want to have the check less stringent, so that rhs may consist
>>>>
>>>> of more values that the lhs has variables.  or even skip the check and
>>>>
>>>> assign NULL to a[i] for i > length(b).  another idea is to allow %
>>>> be used with just one variable on the lhs.
>>>>
>>>>
>>>>
>>>> here's a modified version:
>>>>
>>>>
>>>>
>>>>    '%
>>>>        a
>>>>        if (length(a) > 1)
>>>>
>>>>            a
>>>>        if (length(a) > length(b))
>>>>
>>>>            b
>>>>        e
>>>>        for( i in seq_along( a))
>>>>
>>>>            eval( call( '
>>>>        NULL }
>>>>
>>>>
>>>>
>>>>    {a; b} %
>>>>    # a = 1; b = 2
>>>>
>>>>    a %
>>>>    # a = 3
>>>>
>>>>    {a; b} %
>>>>    # a = 5; b = NULL
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> vQ
>>>>
>>>>         
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
>



More information about the R-devel mailing list