解析包含 `:=` 的表达式?

deparse expressions containing `:=`?

包含 := 的表达式不 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))"

您可以使用 rlang::expr_deparse() 实现您想要的结果,它提供了一些打印改进。

rlang::expr_deparse(call2)

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