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

3

有没有可能将逻辑(或算术)运算符作为参数提供给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

可能是Subtraction method as variable的重复问题。 - pogibas
3个回答

7
在R中,所有的操作符都是函数。因此,您只需要获取操作符函数并调用它即可。
f2 <- function(a, b, operator) getFunction(operator)(a, b)
f2(1, 2, '<')
#[1] TRUE

1
我之前不知道 getFunction 这个函数。它似乎比 eval(parse()) 更简洁一些。而且也更安全吧? - user3375672
1
如果答案是 parse(),你通常应该重新思考问题。(fortune 106) - Roland
1
请参见此链接:https://dev59.com/AGYr5IYBdhLWcg3wdqGw - Roland

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

一种实现这个的方法是使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接