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 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 ...

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

Reply via email to