如何提供(逻辑)运算符作为函数的参数

时间:2017-09-08 11:49:58

标签: r function arguments operators

是否可以提供逻辑(或算术)运算符作为R函数的参数。检查分享主题的this SO问题。

f1 <- function(a, b) a>b

然后

> f1(1,2)
[1] FALSE

如何实现允许我更改功能测试的运算符,例如

f2 <- function(a, b, operator = c('<', '>', '==')) { ... }

然后我想

> f2(1, 2, '<')
[1] TRUE

3 个答案:

答案 0 :(得分:4)

在R中,所有运算符都是函数。因此,您只需要获取运算符函数并调用它。

f2 <- function(a, b, operator) getFunction(operator)(a, b)
f2(1, 2, '<')
#[1] TRUE

答案 1 :(得分:3)

这是另一种选择:

foo <- function(a, b, operator) {
   f <- match.fun(match.arg(operator, choices = c('<', '>', '=='))) 
   f(a,b) 
}

foo(1,2, ">")
#[1] FALSE
foo(1,2, "==")
#[1] FALSE
foo(1,2, "+")
# Show Traceback
# 
# Rerun with Debug
# Error in match.arg(operator, choices = c("<", ">", "==")) : 
#  'arg' should be one of “<”, “>”, “==” 

使用match.arg可以将其限制为某些功能。 match.fun然后得到实际的功能。

如果您不需要对某些输入进行限制,可以跳过match.arg并使用match.fun

答案 2 :(得分:2)

一种方法是使用eval(parse(...))方法,即

f1 <- function(a, b, op){
  eval(parse(text = paste0(a, op, b)))
}

f1(1, 2, '<')
#[1] TRUE
f1(3, 3, '==')
#[1] TRUE
f1(3, 4, '==')
#[1] FALSE