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

R 如何将集合运算表达式编程为函数的参数?,r,function,set,metaprogramming,lazy-evaluation,R,Function,Set,Metaprogramming,Lazy Evaluation,如果我有函数f: f[1]“1”“2”“3”“4” f(a=c('1','2'), b=c('2','3'), c=c('2','3','4'), 条件=“(a*b)+c”) #> [1] "2" "3" "4" f(a=c('1','2'), b=c('2','3'), c=c('2','3','4'), 条件=“(a-b)-c”) #> [1] "1" 如何处理编码参数条件的问题,该参数应该在输入向量上定义一个集合运算表达式 在我的示例中,我使用简单字符串只是为了举例说明预期的行为,但是

如果我有函数
f


f[1]“1”“2”“3”“4”
f(a=c('1','2'),
b=c('2','3'),
c=c('2','3','4'),
条件=“(a*b)+c”)
#> [1] "2" "3" "4"
f(a=c('1','2'),
b=c('2','3'),
c=c('2','3','4'),
条件=“(a-b)-c”)
#> [1] "1"
如何处理编码参数
条件
的问题,该参数应该在输入向量上定义一个集合运算表达式

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

我需要一个简单的方法:

  • 指定此表达式(字符串可能是一个好对象?)
  • 以某种方式解析它,并确保它转换为有效的集合运算表达式
  • 通过应用上述集合运算表达式计算结果

  • 您可以做的一件事就是解析表达式,然后用适当的函数替换
    +
    -
    *
    。那么你就可以对这个表达式进行评估了。比如说

    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)
    }
    

    f@RichScriven:对不起,我从头脑中很快地挑选了这些例子。。。但事实上,向量的类型并没有那么重要,只要假设它对所有输入向量都是相同的。实际上,你在嵌套两个操作。有一个在a*b上运行的函数会更好吗。其中*可以是您定义的任何操作(setdiff、union、interest等),然后您可以有一个外部函数,可以在a*b=y上运行函数1,然后在y*c上再次运行函数1,这真是太棒了!我只是想知道如何检查
    条件
    参数,即验证它是否是一个真正的表达式。。。我不想向用户暴露替换调用中的严重错误。。你有没有建议如何确保
    条件
    实际上是由前面的参数和
    +
    -
    *
    ,以及最终的
    组成的?这取决于你到底想要容忍什么,以及你想要错误消息说什么。您可以尝试匹配parse()以检查有效的表达式。或者您可以定义一个正则表达式来验证输入。好的!您是否介意将该命令分解成一小步,使其更易于食用(我仍在努力进行惰性计算)。据我所知,parse调用返回一个表达式对象,您提取第一个元素(我认为是一个语言对象),然后将其包装在一个列表中,并与其他内容连接……:)我添加了几个临时变量,这样您就可以调试这个函数,并查看它在每个步骤中都做了什么。