识别 R 中的 if/else 语句并从中提取表达式
Identifying if/else statements in R and extracting expressions from them
我想从以下函数的 if/else 块中提取 expr_a, expr_b, expr_c
:
test <- function() {
result <- if (expr_a)
expr_b
else
expr_c
return(result)
}
为了消除死代码(我看过 rco
库,但它目前不支持我正在处理的所有情况)。
我希望能够用 expr_b
替换整个循环,如果 eval(expr_a) == TRUE
或 expr_c
否则。
基于正则表达式的方法解决这个问题的问题是,这个问题有太多可能的变体,我不确定如何捕捉所有变体。例如,上面的代码是一行表达式的有效 R 代码。括号内的多行表达式也可以写成例如:
else
{
# ...
}
有没有什么方法可以在 R 中以编程方式识别和捕获每个可能的 if/else 语句?
我的真实起点的示例:
test <- function() {
my_var <- list(my_bool = FALSE)
my_result <- if(my_var$my_bool) 1
else my_var$my_bool + 2
return(my_result)
}
理想的输出是:list(expression(my_var$my_bool), expression(1), expression(my_var$my_bool + 2))
想通了! as.list
可用于分解对语法树的调用。
例如:
example <- quote(
if (object) {
print(result_true)
} else {
print(result_false)
}
)
as.list(example)
# [[1]]
# `if`
#
# [[2]]
# object
#
# [[3]]
# {
# print(result_true)
# }
#
# [[4]]
# {
# print(result_false)
# }
我想从以下函数的 if/else 块中提取 expr_a, expr_b, expr_c
:
test <- function() {
result <- if (expr_a)
expr_b
else
expr_c
return(result)
}
为了消除死代码(我看过 rco
库,但它目前不支持我正在处理的所有情况)。
我希望能够用 expr_b
替换整个循环,如果 eval(expr_a) == TRUE
或 expr_c
否则。
基于正则表达式的方法解决这个问题的问题是,这个问题有太多可能的变体,我不确定如何捕捉所有变体。例如,上面的代码是一行表达式的有效 R 代码。括号内的多行表达式也可以写成例如:
else
{
# ...
}
有没有什么方法可以在 R 中以编程方式识别和捕获每个可能的 if/else 语句?
我的真实起点的示例:
test <- function() {
my_var <- list(my_bool = FALSE)
my_result <- if(my_var$my_bool) 1
else my_var$my_bool + 2
return(my_result)
}
理想的输出是:list(expression(my_var$my_bool), expression(1), expression(my_var$my_bool + 2))
想通了! as.list
可用于分解对语法树的调用。
例如:
example <- quote(
if (object) {
print(result_true)
} else {
print(result_false)
}
)
as.list(example)
# [[1]]
# `if`
#
# [[2]]
# object
#
# [[3]]
# {
# print(result_true)
# }
#
# [[4]]
# {
# print(result_false)
# }