如何测试变量是否具有lambda函数?

问题描述 投票:2回答:1

我正在建立一个函数,其主要参数可以是各种事物,例如公式,函数或lambda函数,它必须相应地处理事物。

library(rlang)
my_func=function(x){
    if(is_function(x))
        return("X is a function")
    else if(is_lambda(x))
        return("X is a lambda")
    else if(is_formula(x))
        return("X is a formula")
    else 
        return("X is something else")
}
my_func(x=is.numeric) #function
my_func(x=A~B) #formula
my_func(x=~is.numeric(.x)) #formula too :'(
my_func(x="foo") #something else

如您所见,rlang::is_lambda无法识别lambda函数。在帮助文件示例中,他们首先使用as_functionis_lambda(as_function(x))),但是当x不是lambda函数公式时,这将引发转换错误。如果可能的话,我宁愿不使用trycatch,因为我发现它有时会导致无法读取的代码和隐藏的错误。

我如何简单地测试这种情况?

r lambda formula rlang
1个回答
0
投票

您可以删除公式并测试其第一个字符是否为波浪号。这将意味着任何没有左手边的公式都可以被强制转换为lambda,但我想这仍然是理想的行为。

library(rlang)

my_func=function(x){
    if(is_function(x))
        return("X is a function")
    else if(is_formula(x)){
        if(substr(deparse(x), 1, 1) ==  "~"){
            if(is_lambda(as_function(x))) 
                return("X is a lambda")
        }
        return("X is a formula")
    }
    else 
        return("X is something else")
}

my_func(x=is.numeric)
#> [1] "X is a function"
my_func(x=A~B) 
#> [1] "X is a formula"
my_func(x=~is.numeric(.x)) 
#> [1] "X is a lambda"
my_func(x="foo") 
#> [1] "X is something else"

reprex package(v0.3.0)在2020-03-16创建

© www.soinside.com 2019 - 2024. All rights reserved.