首页 > 解决方案 > 识别 R 中的 if/else 语句并从中提取表达式

问题描述

我想expr_a, expr_b, expr_c从以下函数中的 if/else 块中提取:

test <- function() {

    result <- if (expr_a)
                  expr_b
              else
                  expr_c

    return(result)
}

出于消除死代码的目的(我已经看过该rco库,但它目前不支持我正在使用的所有案例)。

我希望能够用expr_bifeval(expr_a) == TRUEexpr_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))

标签: rdead-code

解决方案


弄清楚了!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)
# }


推荐阅读