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