From maechler at stat.math.ethz.ch  Mon May 15 10:39:05 2017
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Mon, 15 May 2017 10:39:05 +0200
Subject: [Rd] stopifnot() does not stop at first non-TRUE argument
In-Reply-To: <8945f7e4-99ce-53fa-46ee-cce64078a6a8@fredhutch.org>
References: <64acdaeb-2857-9017-68c9-9da08e29a617@fredhutch.org>
 <E5DADF15-58C6-4F73-BC56-C6404896982F@gmail.com>
 <c2b3cb22-90bd-5372-e8b9-d1ea8b2ab828@fredhutch.org>
 <8945f7e4-99ce-53fa-46ee-cce64078a6a8@fredhutch.org>
Message-ID: <22809.26921.473223.395550@stat.math.ethz.ch>

>>>>> Herv? Pag?s <hpages at fredhutch.org>
>>>>>     on Wed, 3 May 2017 12:08:26 -0700 writes:

    > On 05/03/2017 12:04 PM, Herv? Pag?s wrote:
    >> Not sure why the performance penalty of nonstandard evaluation would
    >> be more of a concern here than for something like switch().

    > which is actually a primitive. So it seems that there is at least
    > another way to go than 'dots <- match.call(expand.dots=FALSE)$...'

    > Thanks, H.

    >> 
    >> If that can't/won't be fixed, what about fixing the man page so it's
    >> in sync with the current behavior?
    >> 
    >> Thanks, H.

Being back from vacations,...
I agree that something should be done here, if not to the code than at
least to the man page.

For now, I'd like to look a bit longer into a possible change to the function.
Peter mentioned a NSE way to fix the problem and you mentioned switch().

Originally, stopifnot() was only a few lines of code and meant to be
"self-explaining" by just reading its definition, and I really would like
to not walk too much away from that original idea.
How did you (Herve) think to use  switch()  here?



    >> On 05/03/2017 02:26 AM, peter dalgaard wrote:
    >>> The first line of stopifnot is
    >>> 
    >>> n <- length(ll <- list(...))
    >>> 
    >>> which takes ALL arguments and forms a list of them. This implies
    >>> evaluation, so explains the effect that you see.
    >>> 
    >>> To do it differently, you would have to do something like
    >>> 
    >>> dots <- match.call(expand.dots=FALSE)$...
    >>> 
    >>> and then explicitly evaluate each argument in turn in the caller
    >>> frame. This amount of nonstandard evaluation sounds like it would
    >>> incur a performance penalty, which could be undesirable.
    >>> 
    >>> If you want to enforce the order of evaluation, there is always
    >>> 
    >>> stopifnot(A) stopifnot(B)
    >>> 
    >>> -pd
    >>> 
    >>>> On 3 May 2017, at 02:50 , Herv? Pag?s <hpages at fredhutch.org>
    >>>> wrote:
    >>>> 
    >>>> Hi,
    >>>> 
    >>>> It's surprising that stopifnot() keeps evaluating its arguments
    >>>> after it reaches the first one that is not TRUE:
    >>>> 
    >>>> > stopifnot(3 == 5, as.integer(2^32), a <- 12) Error: 3 == 5 is
    >>>> not TRUE In addition: Warning message: In stopifnot(3 == 5,
    >>>> as.integer(2^32), a <- 12) : NAs introduced by coercion to integer
    >>>> range > a [1] 12
    >>>> 
    >>>> The details section in its man page actually suggests that it
    >>>> should stop at the first non-TRUE argument:
    >>>> 
    >>>> ?stopifnot(A, B)? is conceptually equivalent to
    >>>> 
    >>>> { if(any(is.na(A)) || !all(A)) stop(...); if(any(is.na(B)) ||
    >>>> !all(B)) stop(...) }
    >>>> 
    >>>> Best, H.
    >>>> 
    >>>> --
    >>>> Herv? Pag?s
    >>>> 
    >>>> Program in Computational Biology Division of Public Health
    >>>> Sciences Fred Hutchinson Cancer Research Center 1100 Fairview
    >>>> Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024
    >>>> 
    >>>> E-mail: hpages at fredhutch.org Phone: (206) 667-5791 Fax: (206)
    >>>> 667-1319
    >>>> 
    >>>> ______________________________________________
    >>>> R-devel at r-project.org mailing list
    >>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Ddevel&d=DwIFaQ&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=JwgKhKD2k-9Kedeh6pqu-A8x6UEV0INrcxcSGVGo3Tg&s=f7IKJIhpRNJMC3rZAkuI6-MTdL3GAKSV2wK0boFN5HY&e=
    >>>> 
    >>> 
    >> 

    > -- Herv? Pag?s

    > Program in Computational Biology Division of Public Health Sciences
    > Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N,
    > M1-B514 P.O. Box 19024 Seattle, WA 98109-1024

    > E-mail: hpages at fredhutch.org Phone: (206) 667-5791 Fax: (206)
    > 667-1319

    > ______________________________________________
    > 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