r - 如何将集合运算表达式编程为函数的参数?

标签 r function set metaprogramming lazy-evaluation

如果我有函数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)
}

这将返回您在示例中给出的值

关于r - 如何将集合运算表达式编程为函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889122/

相关文章:

r - 将年月日小时和分钟中的数据转换为 R 中的日期

c++ - 在 Rcpp 中分配一个大型二维数组 NumericVectors

c++ - 我应该使用哪个容器来快速找到一个元素,因为知道通过构造它已经被订购了?

algorithm - 创建授予用户权限所需的最少组

r - 为要在数据表的搜索栏中使用的特定值指定不同的名称

使用 data.table 包 reshape 数据

php - 未定义函数的魔法?

python - 将带有 yield(string) 的 python 函数翻译成 C++

javascript - 从不同文件调用函数时出现问题 : "updateDB.inputFormToDB is not a function"

c++ - 如何从集合中释放内存