如何将集合运算表达式编程为函数的参数?
How to program a set operation expression as an argument of a function?
如果我有函数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
的编码问题?
在我的例子中,我使用了简单的字符串来举例说明预期的行为,但是这个解决方案不能很好地扩展。我需要使用语言对象吗(?!)...
我需要一个简单的方法:
- 指定此表达式(字符串可能是个好对象?);
- 以某种方式解析它并确保它转换为有效的集合运算表达式;
- 应用上述集合运算表达式计算结果。
您可以做的一件事就是解析表达式,然后用适当的函数替换 +
、-
和 *
。然后你可以评估那个表达式。例如
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)
}
这 returns 您在示例中给出的值
如果我有函数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
的编码问题?
在我的例子中,我使用了简单的字符串来举例说明预期的行为,但是这个解决方案不能很好地扩展。我需要使用语言对象吗(?!)...
我需要一个简单的方法:
- 指定此表达式(字符串可能是个好对象?);
- 以某种方式解析它并确保它转换为有效的集合运算表达式;
- 应用上述集合运算表达式计算结果。
您可以做的一件事就是解析表达式,然后用适当的函数替换 +
、-
和 *
。然后你可以评估那个表达式。例如
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)
}
这 returns 您在示例中给出的值