Hi Dan, I wouldn't expect that behavior out of `==` on language objects either.
On a related note, working with R's language objects directly can be clumsy. That was one of the motivations for Nick Ulle to develop the rstatic package. https://github.com/nick-ulle/rstatic It lets me write code that's easier to read and reason about, compared to using the standard language objects. It behaves as you hoped here: > s <- quote(f(x123456789012345678901234567890123456789012345678901234567890, 1)) > u <- quote(f(x123456789012345678901234567890123456789012345678901234567890, 2)) > s == u [1] TRUE > s1 = rstatic::to_ast(s) > u1 = rstatic::to_ast(u) > s1 == u1 [1] FALSE Best, Clark On Mon, Jul 15, 2019 at 3:25 AM Daniel Chen <chendani...@gmail.com> wrote: > Hi everyone: > > I’m one of the interns at RStudio this summer working on a project that > helps teachers grade student code. I found an unexpected behaviour with > the |==| operator when comparing |quote|d expressions. > > Example 1: > > |u <- quote(tidyr::gather(key = key, value = value, > new_sp_m014:newrel_f65, na.rm = TRUE)) s <- quote(tidyr::gather(key = > key, value = value, new_sp_m014:newrel_f65, na.rm = FALSE)) u == s # > TRUE u <- quote(tidyr::gather(key = key, value = value, na.rm = TRUE)) s > <- quote(tidyr::gather(key = key, value = value, na.rm = FALSE)) u == s > # FALSE | > > Example 2: > > |u <- > quote(f(x123456789012345678901234567890123456789012345678901234567890, > 1)) s <- > quote(f(x123456789012345678901234567890123456789012345678901234567890, > 2)) u == s #> [1] TRUE | > > Winston Chang pointed out in the help page for |==|: > > Language objects such as symbols and calls are deparsed to character > strings before comparison. > > and in the source code that does the comparison [1] shows that It > deparses each language object and then only extracts the first element > from the resulting character vector: > > |SET_STRING_ELT(tmp, 0, (iS) ? PRINTNAME(x) : STRING_ELT(deparse1(x, 0, > DEFAULTDEPARSE), 0)); | > > Is this a fix that needs to happen within the |==| documentation? or an > actual bug with the operator? > > For more context the original issue we had is here: > https://github.com/rstudio-education/grader/issues/28 > > Workaround: > > You can get around this issue by using |all.equal| or |identical| > > |u <- quote(tidyr::gather(key = key, value = value, > new_sp_m014:newrel_f65, na.rm = TRUE)) s <- quote(tidyr::gather(key = > key, value = value, new_sp_m014:newrel_f65, na.rm = FALSE)) u == s # > TRUE all.equal(u, s) # "target, current do not match when deparsed" > identical(u, s) # FALSE | > > Thanks, > > Dan > > [1] > > https://github.com/wch/r-source/blob/e647f78cb85282263f88ea30c6337b77a30743d9/src/main/relop.c#L140-L155 > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel