是否可以提供逻辑(或算术)运算符作为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
答案 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