выражения, содержащие `: =`? - PullRequest
5 голосов
/ 17 мая 2019

Выражения, содержащие := не 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))".

I 'Я ищу общее решение, которое разбирает := точно так же, как = или <- во всех ситуациях.


Обходной путь

Этот обходной путь использует тот факт, что <<- имеет аналогичный или такой же приоритет и используется не часто.Я заменяю := на <<- в исходном вызове, затем он красиво отбрасывается, и я gsub возвращаю его обратно к :=.Хотелось бы получить чистое и общее решение.

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

1 Ответ

3 голосов
/ 17 мая 2019

Вы можете достичь желаемого результата, используя rlang::expr_deparse(), который предлагает некоторые улучшения печати. ​​

rlang::expr_deparse(call2)

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