我正在建立一个函数,其主要参数可以是各种事物,例如公式,函数或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_function
(is_lambda(as_function(x))
),但是当x
不是lambda函数公式时,这将引发转换错误。如果可能的话,我宁愿不使用trycatch
,因为我发现它有时会导致无法读取的代码和隐藏的错误。
我如何简单地测试这种情况?
您可以删除公式并测试其第一个字符是否为波浪号。这将意味着任何没有左手边的公式都可以被强制转换为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创建