From hpages at fredhutch.org  Wed May  3 21:04:57 2017
From: hpages at fredhutch.org (=?UTF-8?B?SGVydsOpIFBhZ8Oocw==?=)
Date: Wed, 3 May 2017 12:04:57 -0700
Subject: [Rd] stopifnot() does not stop at first non-TRUE argument
In-Reply-To: <E5DADF15-58C6-4F73-BC56-C6404896982F@gmail.com>
References: <64acdaeb-2857-9017-68c9-9da08e29a617@fredhutch.org>
 <E5DADF15-58C6-4F73-BC56-C6404896982F@gmail.com>
Message-ID: <c2b3cb22-90bd-5372-e8b9-d1ea8b2ab828@fredhutch.org>

Not sure why the performance penalty of nonstandard evaluation would
be more of a concern here than for something like switch().

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.

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



[Rd] stopifnot() does not stop at first non-TRUE argument
=?UTF-8?B?SGVydsOpIFBhZ8Oocw==?=