如何将set操作表达式编程为函数的参数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将set操作表达式编程为函数的参数?相关的知识,希望对你有一定的参考价值。

如果我有功能f


f <- function(a = character(0),
              b = character(0),
              c = character(0),
              condition = "a + b + c") {

  if(condition == "a + b + c")
    return(union(union(a, b), c))

  if(condition == "(a * b) + c")
    return(union(intersect(a, b), c))

  if(condition == "(a - b) + c")
    return(union(setdiff(a, b), c))

  if(condition == "(a - b) - c")
    return(setdiff(setdiff(a, b), c))

  # etc...

}


f(a = c('1', '2', '3'),
  b = c('2', '3', '4'),
  c = c('3', '4'),
  condition = "a + b + c")
#> [1] "1" "2" "3" "4"

f(a = c('1', '2'),
  b = c('2', '3'),
  c = c('2', '3', '4'),
  condition = "(a * b) + c")
#> [1] "2" "3" "4"

f(a = c('1', '2'),
  b = c('2', '3'),
  c = c('2', '3', '4'),
  condition = "(a - b) - c")
#> [1] "1"

如何解决编码那个应该在输入向量上定义集合运算表达式的参数condition的问题?

在我的例子中,我使用简单的字符串来举例说明预期的行为,但是这种解决方案不能很好地扩展。我需要使用语言对象(?!)...

我需要一个简单的方法:

  1. 指定此表达式(字符串可能是一个好对象?);
  2. 以某种方式解析它并确保它转换为有效的集合运算表达式;
  3. 通过应用上述设置操作表达式计算结果。
答案

你可以做的一件事就是解析表达式,然后用适当的函数替换+-*。然后你可以只是改变那个表达。例如

f <- function(a = character(0),
              b = character(0),
              c = character(0),
              condition = "a + b + c") {

  parsed_cond <- parse(text=condition)[[1]]
  translated_expr <- do.call("substitute", list(
      parsed_cond,
      list(`+`=quote(union),
           `-`=quote(setdiff),
           `*`=quote(intersect))
   ))
   eval(translated_expr)
}

这将返回您在示例中提供的值

以上是关于如何将set操作表达式编程为函数的参数?的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程

函数式编程———内联函数

函数式编程

如何编写以特征张量为参数的通用模板函数?

《On Java 8》中文版 第十三章 函数式编程

kotlin方法传入lambda表达式参数并调用invoke什么意思