【问题标题】:How to supply (logical) operators as arguments to function如何提供(逻辑)运算符作为函数的参数
【发布时间】:2018-02-17 08:13:27
【问题描述】:

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

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

然后

> f1(1,2)
[1] FALSE

我怎样才能实现一个运算符,例如让我更改功能测试,例如

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

那我愿意

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

【问题讨论】:

标签: r function arguments operators


【解决方案1】:

在 R 中,所有运算符都是函数。所以,你只需要获取操作符函数并调用它。

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

【讨论】:

  • 啊不知道getFunction。它似乎比 eval(parse()) 方法更简洁一些。也许更安全?
  • @user3375672 “如果答案是parse(),您通常应该重新考虑这个问题。” (fortune 106)
  • 另见this
【解决方案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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 2018-04-28
      • 2015-05-13
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多