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 Best Regards, Lukas Stadler ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel