From murdoch.duncan at gmail.com  Mon Jan  4 18:42:14 2016
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Mon, 4 Jan 2016 12:42:14 -0500
Subject: [Rd] deparse with parentheses for SUBSET
In-Reply-To: <EFE63DD3-7E5D-4C56-A7C1-32124558B863@oracle.com>
References: <EFE63DD3-7E5D-4C56-A7C1-32124558B863@oracle.com>
Message-ID: <568AAEF6.4040407@gmail.com>

On 04/01/2016 11:09 AM, Lukas Stadler wrote:
> Hi,
>
> maybe there?s a reason for it, but the discrepancy between the handling of `[` and `$` in deparsing seems odd to me:
> > substitute(a[1], list(a = quote(x * y)))
> x * y[1]
> > substitute(a$b, list(a = quote(x * y)))
> (x * y)$b
>
> The former is still executed in the right order (`*` first, then `[`), which is not what you?d expect looking at the deparse result.
> Some code that shows the execution order:
> x <- 1; y <- 1; class(y) <- "foo"; `*.foo` <- function(...) -1; expr <- substitute(a[1], list(a=quote(x * y))); list(expr=expr, eval=eval(expr), "x * y[1]"=x * y[1], "(x * y)[1]"=(x * y)[1])
>
> The following simple fix solves the problem for me:
>
> diff -u -r A/src/main/deparse.c B/src/main/deparse.c
> --- R-devel 2/src/main/deparse.c	2015-08-09 18:09:04.000000000 +0200
> +++ R-devel/src/main/deparse.c	2016-01-04 16:15:09.000000000 +0100
> @@ -971,7 +971,11 @@
>   		    print2buff(")", d);
>   		    break;
>   		case PP_SUBSET:
> +		    if ((parens = needsparens(fop, CAR(s), 1)))
> +			print2buff("(", d);
>   		    deparse2buff(CAR(s), d);
> +		    if (parens)
> +			print2buff(")", d);
>   		    if (PRIMVAL(SYMVALUE(op)) == 1)
>   			print2buff("[", d);
>   		    else
>
> With this applied, the output is more consistent:
> > substitute(a[1], list(a = quote(x * y)))
> (x * y)[1]
> > substitute(a$b, list(a = quote(x * y)))
> (x * y)$b

No reason, just a bug.  I'll fix it.

Duncan Murdoch



[Rd] deparse with parentheses for SUBSET
Duncan Murdoch