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调用返回一个表达式对象,您提取第一个元素(我认为是一个语言对象),然后将其包装在一个列表中,并与其他内容连接……:)我添加了几个临时变量,这样您就可以调试这个函数,并查看它在每个步骤中都做了什么。