[R] stopifnot() doesnt work as I expect it to. Are my expectations correct?

Duncan Murdoch murdoch.duncan at gmail.com
Fri May 20 17:42:28 CEST 2016


On 20/05/2016 10:33 AM, William Dunlap wrote:
> The following usage of stopifnot seems reasonable to me and it
> would be nice if the 2nd call caused the message 'is.data.frame(df) is
> not TRUE'.
>
> f <- function(df) {
>     stopifnot(is.data.frame(df), is.integer(df$ID))
>     range(df$ID)
> }

Yes, that's an example where the proposed behaviour makes sense.  But

stopifnot(is.data.frame(df)); stopifnot(is.integer(df$ID))

isn't that much harder to type, and it already does what you want.

Duncan Murdoch


> f(data.frame(ID=4:7))
> # [1] 4 7
> f(4:7)
> # Error in df$ID : $ operator is invalid for atomic vectors
>
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com <http://tibco.com>
>
> On Fri, May 20, 2016 at 7:13 AM, Duncan Murdoch
> <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>> wrote:
>
>     On 20/05/2016 4:44 AM, Vasanth Mohan wrote:
>
>         Hi,
>
>         *stopifnot(FALSE, someOtherExpression)*
>
>         For the above code I expect stopifnot() to always say that
>         'FALSE is not
>         TRUE' regardless of what someOtherExpression is(It may evaluate
>         to TRUE or
>         FALSE or throw an error). Is my expectation correct? Is that how
>         stopifnot() is supposed to work?
>
>         The present implementation of stopifnot() does not work like
>         that. If
>         someOtherExpression would throw an error, then stopifnot()
>         throws that
>         error instead of saying 'FALSE is not TRUE'.
>
>         So, I modified the source code of stopifnot() and now it works
>         as I expect
>         it to.
>         If that is how stopifnot() is supposed to work, then kindly let
>         me know how
>         I can contribute my solution
>
>
>     The documentation is unclear on that.  First it implies all
>     expressions are evaluated:  "If any of the expressions in ... are
>     not all TRUE, stop is called, producing an error message indicating
>     the first of the elements of ... which were not true."
>
>     But then the "conceptually equivalent" code acts the way you expected.
>
>     However, it doesn't really make sense to me to put in tests that
>     could themselves trigger errors unless you'd be interested in seeing
>     those errors, so I don't think I'd change it.
>
>     Duncan Murdoch
>
>     ______________________________________________
>     R-help at r-project.org <mailto:R-help at r-project.org> mailing list --
>     To UNSUBSCRIBE and more, see
>     https://stat.ethz.ch/mailman/listinfo/r-help
>     PLEASE do read the posting guide
>     http://www.R-project.org/posting-guide.html
>     and provide commented, minimal, self-contained, reproducible code.
>
>



More information about the R-help mailing list