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

Daniel Chen chend@n|e|y @end|ng |rom gm@||@com
Fri Jul 12 20:53:21 CEST 2019


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



More information about the R-devel mailing list