包含`:=`?的稀疏表达式

时间:2019-05-17 12:30:00

标签: r parsing colon-equals

包含:=的表达式不能很好地deparse

call1 <- quote(f(a = b(c = d)))
call2 <- quote(f(a := b(c := d)))

# nice
deparse(call1)
#> [1] "f(a = b(c = d))"

# not nice
deparse(call2)
# [1] "f(`:=`(a, b(`:=`(c, d))))"

我想从call2中获得以下输出:"f(a := b(c := d))"

我正在寻找一种在所有情况下都像:==那样贬低<-的通用解决方案。


解决方法

此变通办法利用<<-具有相似或相同优先级并且不经常使用的事实。在原始通话中,我用:=替换了<<-,然后将其很好地还原,然后我gsub将其退回到:=。我想要一个干净而通用的解决方案。

gsub("<<-",":=", deparse(do.call(
  substitute, list(call2, list(`:=` = quote(`<<-`))))))
#> [1] "f(a := b(c := d))"

1 个答案:

答案 0 :(得分:3)

您可以使用rlang::expr_deparse()来获得所需的结果,这会改善打印质量。

rlang::expr_deparse(call2)

[1] "f(a := b(c := d))"