From maechler at stat.math.ethz.ch  Thu May 18 10:03:28 2017
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Thu, 18 May 2017 10:03:28 +0200
Subject: [Rd] stopifnot() does not stop at first non-TRUE argument
In-Reply-To: <1034131318.560887.1494952665524@mail.yahoo.com>
References: <1034131318.560887.1494952665524.ref@mail.yahoo.com>
 <1034131318.560887.1494952665524@mail.yahoo.com>
Message-ID: <22813.21840.123266.967166@stat.math.ethz.ch>

>>>>> Suharto Anggono Suharto Anggono via R-devel <r-devel at r-project.org>
>>>>>     on Tue, 16 May 2017 16:37:45 +0000 writes:

    > switch(i, ...)
    > extracts 'i'-th argument in '...'. It is like
    > eval(as.name(paste0("..", i))) .

Yes, that's neat.

It is only almost the same:  in the case of illegal 'i'
the switch() version returns
    invisible(NULL)

whereas the version we'd want should signal an error, typically
the same error message as

  > t2 <- function(...) ..2
  > t2(1)
  Error in t2(1) (from #1) : the ... list does not contain 2 elements
  > 


    > Just mentioning other things:
    > - For 'n',
    > n <- nargs()
    > can be used.

I know .. [in this case, where '...' is the only formal argument of the function]

    > - sys.call() can be used in place of match.call() .

Hmm... in many cases, yes.... notably, as we do *not* want the
argument names here, I think you are right.


    > ---------------------------
>>>>> peter dalgaard <pdalgd at gmail.com>
>>>>>     on Mon, 15 May 2017 16:28:42 +0200 writes:

    >> I think Herv?'s idea was just that if switch can evaluate arguments selectively, so can stopifnot(). But switch() is .Primitive, so does it from C. 

    > if he just meant that, then "yes, of course" (but not so interesting).

    >> I think it is almost a no-brainer to implement a sequential stopifnot if dropping to C code is allowed. In R it gets trickier, but how about this:

    > Something like this, yes, that's close to what Serguei Sokol had proposed
    > (and of course I *do*  want to keep the current sophistication
    > of stopifnot(), so this is really too simple)

    >> Stopifnot <- function(...)
    >> {
    >> n <- length(match.call()) - 1
    >> for (i in 1:n)
    >> {
    >> nm <- as.name(paste0("..",i))
    >> if (!eval(nm)) stop("not all true")
    >> }
    >> }
    >> Stopifnot(2+2==4)
    >> Stopifnot(2+2==5, print("Hey!!!") == "Hey!!!")
    >> Stopifnot(2+2==4, print("Hey!!!") == "Hey!!!")
    >> Stopifnot(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T)


    >>> On 15 May 2017, at 15:37 , Martin Maechler <maechler at stat.math.ethz.ch> wrote:
    >>> 
    >>> I'm still curious about Herv?'s idea on using  switch()  for the
    >>> issue.

    >> -- 
    >> Peter Dalgaard, Professor,
    >> Center for Statistics, Copenhagen Business School
    >> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
    >> Phone: (+45)38153501
    >> Office: A 4.23
    >> Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com

    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] stopifnot() does not stop at first non-TRUE argument
Martin Maechler