[Rd] Change DEFAULTDEPARSE to DEFAULTDEPARSE | SHOWATTRIBUTES ?

2023-05-06 Thread Mikael Jagan

The deparse options used by default by 'deparse' and 'dput' are

c("keepNA", "keepInteger", "niceNames", "showAttributes")

but Defn.h still has

#define DEFAULTDEPARSE		1089 /* KEEPINTEGER | KEEPNA | NICE_NAMES, used for 
calls */


i.e., with the SHOWATTRIBUTES bit turned off.  Is that on purpose?
Note that this leads to weird things like:

> (expr <- call("is.matrix", matrix(1:4, 2L, 2L)))
is.matrix(1:4)
> eval(expr)
[1] TRUE

which can confuse anyone not paying close attention ...

Mikael

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Change DEFAULTDEPARSE to DEFAULTDEPARSE | SHOWATTRIBUTES ?

2023-05-06 Thread Duncan Murdoch

On 06/05/2023 12:26 p.m., Mikael Jagan wrote:

The deparse options used by default by 'deparse' and 'dput' are

  c("keepNA", "keepInteger", "niceNames", "showAttributes")

but Defn.h still has

  #define DEFAULTDEPARSE1089 /* KEEPINTEGER | KEEPNA | 
NICE_NAMES, used for
calls */

i.e., with the SHOWATTRIBUTES bit turned off.  Is that on purpose?
Note that this leads to weird things like:

  > (expr <- call("is.matrix", matrix(1:4, 2L, 2L)))
  is.matrix(1:4)
  > eval(expr)
  [1] TRUE

which can confuse anyone not paying close attention ...


I agree that deparse does a better job in this case, but I'm not sure 
I'd recommend the change.  You should try it, and see if any tests are 
broken.  I'd guess there will be some in base R, but I might be wrong.


Contributed packages are another issue.  Lots of packages test for 
changes in their output; this change could break those.


I think the underlying issue is that call("is.matrix", matrix(1:4, 2L, 
2L)) produces something that would never be produced by the parser, so 
"deparsing" isn't really well defined.


For example deparse(expr) also gets it wrong:

  [1] "is.matrix(structure(1:4, dim = c(2L, 2L)))"

Even though that evaluates to the same result, it isn't the expression I 
put into expr.  There are also many examples where you don't get the 
right answer from either version.  A simple one is this:


   > (expr <- call("identity", pi))
   identity(3.14159265358979)
   > eval(expr)
   [1] 3.141593
   > eval(expr) == identity(3.14159265358979)
   [1] FALSE

Here the issue is that the deparsed expression doesn't include the full 
precision for pi that is stored in expr.


(Aside:  This is one reason why it's such a bad idea to use the common 
pattern:


   deparse expression
   modify part of it
   parse the result

You can often get more changes than you intended.  It's better to work 
on the expression directly.)


BTW, I just noticed something else in deparse() that's probably a bug.

   > deparse(expr, control = "exact")
   [1] "quote(I(0x1.921fb54442d18p+1))"

I don't know why "quote" is now showing up; it means that

   parse(text = deparse(expr, control = "exact"))

produces something that's really quite different from expr.

Duncan Murdoch

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel