如何在 R 中获取 AST 作为列表
How to get AST as a list in R
我有描述数学公式的字符串,我想将其转换成有意义部分的列表。函数 ast_
知道如何解析它,将其显示为抽象语法树,但不知道 return AST。我正在寻找一个 return 树的函数。
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
您可以使用 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
我有描述数学公式的字符串,我想将其转换成有意义部分的列表。函数 ast_
知道如何解析它,将其显示为抽象语法树,但不知道 return AST。我正在寻找一个 return 树的函数。
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
您可以使用 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