R语言 如何测试以函数作为输入的if else条件?

tzdcorbm  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(140)

我有一个R函数,它接受另一个函数作为输入(例如mean、var等)。如果输入函数是“variance”而不是mean等,我希望返回一个不同的结果。类似于函数的等于赋值语句。注意函数输入应该是作为as.function()类对象的函数本身,而不是字符串"function"

myFun = function(...,FUN) {
  ...
  if (FUN!=var) {...} else {...}
}

以上代码在当前形式下不起作用。我得到以下错误:

Error in FUN != var : 
  comparison (2) is possible only for atomic and list types
a1o7rhls

a1o7rhls1#

使用ensym

myFun <- function(FUN)
  {
  if(rlang::as_string(rlang::ensym(FUN)) != "var") {
      print("fx isn't var")
  } else {
    print("fx is var")
  }
}
  • 测试
> myFun(var)
[1] "fx is var"
> myFun(mean)
[1] "fx isn't var"

但是,可以直接传递该函数

f1 <- function(x, FUN) FUN(x)
> f1(1:5, var)
[1] 2.5
> f1(1:5, mean)
[1] 3
5vf7fwbs

5vf7fwbs2#

您可以将函数名转换为字符,然后在此基础上进行测试:

myFun = function(FUN) {
  if (as.character(substitute(FUN)) != "var") {
    print("fx isn't var")
  } else {
    print("fx is var")
  }
}

myFun(var)
# [1] "fx is var"

myFun(mean)
# [1] "fx isn't var"

注意,如果你传递"var"而不是var,这也会打印"fx is var",并且即使输入根本不是函数,也会打印"fx isn’t var",你可以在函数的开头添加stopifnot(is.function(FUN))来处理这些情况。

相关问题