有没有可能将逻辑(或算术)运算符作为参数提供给R函数。请查看this SO问题,它涉及到这个主题。
f1 <- function(a, b) a>b
然后
> f1(1,2)
[1] FALSE
我该如何实现一个运算符,使我能够更改函数 test,例如:
f2 <- function(a, b, operator = c('<', '>', '==')) { ... }
然后我想要
> f2(1, 2, '<')
[1] TRUE
有没有可能将逻辑(或算术)运算符作为参数提供给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
f2 <- function(a, b, operator) getFunction(operator)(a, b)
f2(1, 2, '<')
#[1] TRUE
getFunction
这个函数。它似乎比 eval(parse()) 更简洁一些。而且也更安全吧? - user3375672foo <- 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
。
一种实现这个的方法是使用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