[Rd] length of `...`
Martin Maechler
maechler at stat.math.ethz.ch
Fri May 4 18:13:24 CEST 2018
>>>>> Joris Meys <jorismeys at gmail.com>
>>>>> on Fri, 4 May 2018 15:37:27 +0200 writes:
> The one difference I see, is the necessity to pass the dots to the function
> dotlength :
> dotlength <- function(...) nargs()
> myfun <- function(..., someArg = 1){
> n1 <- ...length()
> n2 <- dotlength()
> n3 <- dotlength(...)
> return(c(n1, n2, n3))
> }
> myfun(stop("A"), stop("B"), someArg = stop("c"))
> I don't really see immediately how one can replace the C definition with
> Hadley's solution without changing how the function has to be used.
Yes, of course: nargs() can only be applied to the function inside
which it is used, and hence n2 <- dotlength() must therefore be 0.
Thank you, Joris
> Personally, I have no preference over the use, but changing it now would
> break code dependent upon ...length() imho. Unless I'm overlooking
> something of course.
Yes. OTOH, as it's been very new, one could consider
deprecating it, and advertize say, .length(...) instead of ...length()
[yes, in spite of the fact that the pure-R solution is slower
than a primitive; both are fast enough for all purposes]
But such a deprecation cycle typically entails time more writing
etc, not something I've time for just these days.
Martin
> On Fri, May 4, 2018 at 3:02 PM, Martin Maechler <maechler at stat.math.ethz.ch>
> wrote:
>> >>>>> Hervé Pagès <hpages at fredhutch.org>
>> >>>>> on Thu, 3 May 2018 08:55:20 -0700 writes:
>>
>> > Hi,
>> > It would be great if one of the experts could comment on the
>> > difference between Hadley's dotlength and ...length? The fact
>> > that someone bothered to implement a new primitive for that
>> > when there seems to be a very simple and straightforward R-only
>> > solution suggests that there might be some gotchas/pitfalls with
>> > the R-only solution.
>>
>> Namely
>>
>> > dotlength <- function(...) nargs()
>>
>> > (This is subtly different from calling nargs() directly as it will
>> > only count the elements in ...)
>>
>> > Hadley
>>
>>
>> Well, I was the "someone". In the past I had seen (and used myself)
>>
>> length(list(...))
>>
>> and of course that was not usable.
>> I knew of some substitute() / match.call() tricks [but I think
>> did not know Bill's cute substitute(...()) !] at the time, but
>> found them too esoteric.
>>
>> Aditionally and importantly, ...length() and ..elt(n) were
>> developed "synchronously", and the R-substitutes for ..elt()
>> definitely are less trivial (I did not find one at the time), as
>> Duncan's example to Bill's proposal has shown, so I had looked
>> at .Primitive() solutions of both.
>>
>> In hindsight I should have asked here for advice, but may at
>> the time I had been a bit frustrated by the results of some of
>> my RFCs ((nothing specific in mind !))
>>
>> But __if__ there's really no example where current (3.5.0 and newer)
>>
>> ...length()
>>
>> differs from Hadley's dotlength()
>> I'd vert happy to replace ...length 's C based definition by
>> Hadley's beautiful minimal solution.
>>
>> Martin
More information about the R-devel
mailing list