[R] A stopifnot() nastiness, even if not a bug

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Mon Apr 13 22:30:35 CEST 2020


>>>>> William Dunlap 
>>>>>     on Mon, 13 Apr 2020 09:57:11 -0700 writes:

    > You can avoid the problem in Martin's example by only giving scalars to
    > stopifnot().  E.g., using stopifnot(all(x>0)) or stopifnot(length(x)==1,
    x> 0) instead of stopifnot(x>0).  I think having stopifnot call
    > all(predicate) if length(predicate)!=1 was probably a mistake.

well, maybe.
As I brougth up the 0-length example:  One could think of making
an exception for  logical(0)  and treat that as non-TRUE.

(for R-devel only, but still probably not this close before
 releasing R 4.0.0)

Martin

    > Bill Dunlap
    > TIBCO Software
    > wdunlap tibco.com


    > On Mon, Apr 13, 2020 at 9:28 AM Hervé Pagès <hpages using fredhutch.org> wrote:

    >> 
    >> 
    >> On 4/13/20 05:30, Martin Maechler wrote:
    >> >>>>>> peter dalgaard
    >> >>>>>>      on Mon, 13 Apr 2020 12:00:38 +0200 writes:
    >> >
    >> >      > Inline...
    >> >      >> On 13 Apr 2020, at 11:15 , Martin Maechler <
    >> maechler using stat.math.ethz.ch> wrote:
    >> >      >>
    >> >      >>>>>>> Bert Gunter
    >> >      >>>>>>> on Sun, 12 Apr 2020 16:30:09 -0700 writes:
    >> >      >>
    >> >      >>> Don't know if this has come up before, but ...
    >> >      >>>> x <- c(0,0)
    >> >      >>>> length(x)
    >> >      >>> [1] 2
    >> >      >>> ## but
    >> >      >>>> stopifnot(length(x))
    >> >      >>> Error: length(x) is not TRUE
    >> >      >>> Called from: top level
    >> >      >>> ## but
    >> >      >>>> stopifnot(length(x) > 0)  ## not an error;  nor is
    >> >      >>>> stopifnot(as.logical(length(x)))
    >> >      >>> ## Ouch!
    >> >      >>
    >> >      >>> Maybe the man page should say something about not assuming
    >> automatic
    >> >      >>> coercion to logical, which is the usual expectation. Or fix
    >> this.
    >> >      >>
    >> >      >>> Bert Gunter
    >> >      >>
    >> >      >> Well, what about the top most paragraph of the help page is not
    >> clear here ?
    >> >      >>
    >> >      >>> Description:
    >> >      >>
    >> >      >>> If any of the expressions (in '...' or 'exprs') are not 'all'
    >> >      >>> 'TRUE', 'stop' is called, producing an error message indicating
    >> >      >>> the _first_ expression which was not ('all') true.
    >> >      >>
    >> >
    >> >      > This, however, is somewhat less clear:
    >> >
    >> >      > ..., exprs: any number of (typically but not necessarily
    >> ‘logical’) R
    >> >      > expressions, which should each evaluate to (a logical vector
    >> >      > of all) ‘TRUE’.  Use _either_ ‘...’ _or_ ‘exprs’, the latter
    >> >
    >> >      > What does it mean, "typically but not necessarily ‘logical’"?
    >> >
    >> > That's a good question: The '(....)' must have been put there a while
    >> ago.
    >> > I agree that it's not at all helpful. Strictly, we are really
    >> > dealing with unevaluated expressions anyway ("promises"), but
    >> > definitely all of them must evaluate to logical (vector or
    >> > array..) of all TRUE values.  In the very beginning of
    >> > stopifnot(), I had thought that it should also work in other
    >> > cases, e.g.,  for    Matrix(TRUE, 4,5)  {from the Matrix package} etc,
    >> > but several use cases had convinced us / me that stopifnot
    >> > should be stricter...
    >> >
    >> >      > The code actually tests explicitly with is.logical, as far as I
    >> can tell.
    >> >
    >> >      > This creates a discrepancy between if(!...)stop(...) and
    >> stopifnot(),
    >> >
    >> > yes indeed, on purpose now, for a very long time ...
    >> >
    >> > There's another discrepancy, more dangerous I think,
    >> > as shown in the following
    >> > {Note this discrepancy has been noted for a long time .. also on
    >> >   this R-devel list} :
    >> >
    >> >    m <- matrix(1:12, 3,4)
    >> >    i <- (1:4) %% 2 == 1  & (0:3) %% 5 == 0
    >> >
    >> >    stopifnot(dim(m[,i]) == c(3,1))       # seems fine
    >> >
    >> >    if(dim(m[,i]) != c(3,1)) stop("wrong dim") # gives an error (but not
    >> ..)
    >> 
    >> mmh... that is not good. I was under the impression that we could at
    >> least expect 'stopifnot(x)' to be equivalent to 'if (!isTRUE(x))
    >> stop(...)'. I'll have to revisit my use of stopifnot() in many many
    >> places... again :-/ Or may be just stop using it and use 'if
    >> (!isTRUE(...))' instead.
    >> 
    >> H.
    >> 
    >> >
    >> >
    >> > Martin
    >> >
    >> >      >> as in
    >> >      >> f <- function (x) if (!x) stop(paste(deparse(substitute(x)), "is
    >> not TRUE"))
    >> >      >> f(0)
    >> >      > Error in f(0) : 0 is not TRUE
    >> >      >> f(1)
    >> >      >> stopifnot(0)
    >> >      > Error: 0 is not TRUE
    >> >      >> stopifnot(1)
    >> >      > Error: 1 is not TRUE
    >> >
    >> >      > -pd
    >> >
    >> >
    >> >      >> If useR's expectations alone would guide the behavior of a
    >> >      >> computer language, the language would have to behave
    >> >      >> "personalized" and give different results depending on the user,
    >> >      >> which may be desirable in medicine or psychotherapy but not with
    >> R.
    >> >      >>
    >> >      >> Martin
    >> >      >>
    >> >      >> ______________________________________________
    >> >      >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more,
    >> see
    >> >      >>
    >> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dhelp&d=DwIDaQ&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=2kAPk_-c9XEQGS0BB1rf03oPxqQtflyqhqi-0BT8bWE&s=W8I5sRKBBKZgSjXrQC_PQw6XXUApw5h2DI5EUoDdl9w&e=
    >> >      >> PLEASE do read the posting guide
    >> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org_posting-2Dguide.html&d=DwIDaQ&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=2kAPk_-c9XEQGS0BB1rf03oPxqQtflyqhqi-0BT8bWE&s=ADWOmjdAMLWT3rJRMz411RnDjrc6Vyj4NNmZMoM3Sck&e=
    >> >      >> and provide commented, minimal, self-contained, reproducible
    >> code.
    >> >
    >> >      > --
    >> >      > 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 using cbs.dk  Priv: PDalgd using gmail.com
    >> >
    >> > ______________________________________________
    >> > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
    >> >
    >> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dhelp&d=DwIDaQ&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=2kAPk_-c9XEQGS0BB1rf03oPxqQtflyqhqi-0BT8bWE&s=W8I5sRKBBKZgSjXrQC_PQw6XXUApw5h2DI5EUoDdl9w&e=
    >> > PLEASE do read the posting guide
    >> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org_posting-2Dguide.html&d=DwIDaQ&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=2kAPk_-c9XEQGS0BB1rf03oPxqQtflyqhqi-0BT8bWE&s=ADWOmjdAMLWT3rJRMz411RnDjrc6Vyj4NNmZMoM3Sck&e=
    >> > and provide commented, minimal, self-contained, reproducible code.
    >> >
    >> 
    >> --
    >> 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 using fredhutch.org
    >> Phone:  (206) 667-5791
    >> Fax:    (206) 667-1319
    >> 
    >> ______________________________________________
    >> R-help using 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