drop_parens {lazy.symbolic} | R Documentation |
drop parens
Description
Remove unnecessary parentheses from an expression#'
Usage
drop_parens(expr, all = FALSE, in_biop = FALSE)
Arguments
expr |
an expression or a string |
all |
= TRUE if all parens should be removed from ast. |
in_biop |
flag for recursive process. |
Value
an expression
Examples
modify_math_operators()
# example code
drop_parens("X")
drop_parens("(X)")
drop_parens("((X))")
drop_parens("(t((X)))")
drop_parens("(t((tr((X)))))") |> show_ast()
drop_parens("(t((tr((X)))))") |> show_ast()
drop_parens("(A*B)")
# examples for all
drop_parens("((A%*%(B*((C%*%C)))))") |> show_ast()
drop_parens("((A%*%(B*((C%*%C)))))", all = TRUE)|> show_ast()
drop_parens("((A%*%(B*((C%*%C)))))") |> show_ast()
drop_parens("((A%*%(B*((C%*%C)))))", all = TRUE)|> show_ast()
expr <- easy_parse("(X*A)%*%C") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("C%*%(X*A)") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("(X%*%A)*C") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("C*(X%*%A)") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("C%*%(X%*%A)") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
expr <- easy_parse("(C%*%X)%*%A") ; expr |> show_ast()
drop_parens(expr) |> show_ast()
# かっこに対する考察
easy_parse("X%*%B%*%C") |> show_ast()
easy_parse("(X%*%B)%*%C") |> show_ast()
easy_parse("(X*B)%*%C") |> show_ast()
easy_parse("X*B%*%C") |> show_ast() # %*%が*よりも優先度高い
# second factor
expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[3]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[3]] <- easy_parse("(X%*%B)"); show_ast(expr)
# first factor
expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[2]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[2]] <- easy_parse("(X%*%B)"); show_ast(expr)
#つまり
#1. 構文木に代入する場合は、
# 1.1. 左から順にの計算順序から変わる場合は、見た目上の () がつく。
# そうでない場合は()なし。
# 1.2. ()を明示的に入れた場合はちゃんと実際の構文木上も現れる。
#2. 必要不要問わず、"()" 付きをパースすると、必ず () が構文木に現れる。
expr <- easy_parse("A*C") ; expr |> show_ast()
expr[[2]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[2]] <- easy_parse("(X%*%B)"); show_ast(expr)
expr <- easy_parse("A*C") ; expr |> show_ast()
expr[[3]] <- easy_parse("X%*%B"); show_ast(expr)
expr[[3]] <- easy_parse("(X%*%B)"); show_ast(expr)
expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[2]] <- easy_parse("X*B"); show_ast(expr)
expr[[2]] <- easy_parse("(X*B)"); show_ast(expr)
expr <- easy_parse("A%*%C") ; expr |> show_ast()
expr[[3]] <- easy_parse("X*B"); show_ast(expr)
expr[[3]] <- easy_parse("(X*B)"); show_ast(expr)
expr <- easy_parse("(X*A)%*%C") ; expr |> show_ast()
expr <- easy_parse("C%*%(X*A)") ; expr |> show_ast()
# ということは、構文木上では一度かっこをほぼすべて外しても問題ない。(はず)
easy_parse("X%*%(B*C)") |> show_ast() # %*%が*よりも優先度高い
easy_parse("X%*%B*C") |> show_ast() # %*%が*よりも優先度高い
easy_parse("X%*%B*C") |> show_ast() # %*%が*よりも優先度高い
[Package lazy.symbolic version 1.0.0.20250803 ]