Как получить АСТ в виде списка в R - PullRequest
2 голосов
/ 05 февраля 2020

У меня есть строки, которые описывают математические формулы, и я хотел бы преобразовать их в списки значимых частей. Функция ast_ знает, как ее проанализировать, чтобы отобразить ее в виде абстрактного синтаксического дерева, но не возвращает AST. Я ищу функцию, которая возвращает дерево.

bb <- "(media.urin_A + media.urin_B)/2"
lazyeval::ast_(rlang::parse_expr(bb))
> lazyeval::ast_(rlang::parse_expr(bb))
┗ ()
 ┗ `/
 ┗ ()
  ┗ `(
  ┗ ()
   ┗ `+
   ┗ `media.urin_A
   ┗ `media.urin_B
 ┗  2 

1 Ответ

2 голосов
/ 05 февраля 2020

Вы можете построить один рекурсивно используя as.list() и map_if из purrr:

getAST <- function(ee) purrr::map_if(as.list(ee), is.call, getAST)

# Example usage on expressions:
getAST( quote(log10(a+5)/b) )
# List of 3
#  $ : symbol /
#  $ :List of 2
#   ..$ : symbol log10
#   ..$ :List of 3
#   .. ..$ : symbol +
#   .. ..$ : symbol a
#   .. ..$ : num 5
#  $ : symbol b

# Example usage on strings:
getAST( str2lang("(media.urin_A + media.urin_B)/2") )
# List of 3
#  $ : symbol /
#  $ :List of 2
#   ..$ : symbol (
#   ..$ :List of 3
#   .. ..$ : symbol +
#   .. ..$ : symbol media.urin_A
#   .. ..$ : symbol media.urin_B
#  $ : num 2
...