From m@ech|er @end|ng |rom @t@t@m@th@ethz@ch  Mon Apr  1 18:13:28 2019
From: m@ech|er @end|ng |rom @t@t@m@th@ethz@ch (Martin Maechler)
Date: Mon, 1 Apr 2019 18:13:28 +0200
Subject: [Rd] [External] Re:  stopifnot -- eval(*) inside for()
In-Reply-To: <alpine.DEB.2.21.1904010739270.12495@luke-Latitude-7480>
References: <789570515.14008055.1554045973573.ref@mail.yahoo.com>
 <789570515.14008055.1554045973573@mail.yahoo.com>
 <23713.57634.84910.241373@stat.math.ethz.ch>
 <alpine.DEB.2.21.1904010739270.12495@luke-Latitude-7480>
Message-ID: <23714.14504.768459.429274@stat.math.ethz.ch>

>>>>> Tierney, Luke 
>>>>>     on Mon, 1 Apr 2019 12:41:08 +0000 writes:

    > On Mon, 1 Apr 2019, Martin Maechler wrote:
    >>>>>>> Suharto Anggono Suharto Anggono via R-devel
    >>>>>>> on Sun, 31 Mar 2019 15:26:13 +0000 writes:
    >> 
    >> > Ah, with R 3.5.0 or R 3.4.2, but not with R 3.3.1, 'eval'
    >> > inside 'for' makes compiled version behave like
    >> > non-compiled version.
    >> 
    >> Ah.. ... thank you for detecting that  " eval() inside for()" behaves
    >> specially  in how error message get a call or not.

    > Don't count on that remaining true indefinitely. The standard behavior
    > is better and we'll eventually get the case where 'eval' and a few
    > others are called to behave the same.

    > Best,
    > luke

Yes, Suharto did indeed mention that it may not be a good idea
to rely on that behavior, and I did agree ... though my
agreement was a bit buried in other stuff.

Note that I have been asking if this "accidental" but internally
consistent behavior for the current situation, could not be made
a feature that the user can ask for ... without having to use a
handler (which had been a real slowdown when used inside
stopifnot() in R 3.5.3) :


  [................]
  [................]

    >> So it seems I am asking for a new feature in R,
    >> namely to temporarily say: Set the call to errors to NULL "in
    >> the following".

    >> In R 3.5.x, I had used withCallingHandlers(...) to achieve that
    >> and do even similar for warnings... but needed to that for every
    >> expression and hence inside the for loop  and the consequence
    >> was a relatively large slowdown of stopifnot()..  which
    >> triggered all the changes since.
    >> 
    >> Whereas what we see here ["eval() inside for()"] is a cheap
    >> automatic suppression of 'call' for the "internal errors", i.e.,
    >> those we don't trigger ourselves via stop(simpleError(...)).

So, for me as programmeR, it would be nice to be able to ask for
"this" behavior explicitly in a special case as here, where
"no-call" error messages are preferable .. because the call can
be really large and is known to be  "almost surely" distracting
rather than helpful.

Martin



[Rd] [External] Re: stopifnot -- eval(*) inside for()
Martin Maechler