[Rd] Unexpected behaviour when comparing (==) long quoted expressions

Clark Fitzgerald c|@rk||tzg @end|ng |rom gm@||@com
Mon Jul 15 19:12:51 CEST 2019


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 <chendaniely using 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 using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

	[[alternative HTML version deleted]]



More information about the R-devel mailing list