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