计算R data.table中的表达式
我有以下计算R data.table中的表达式,r,eval,data.table,R,Eval,Data.table,我有以下数据。表: > dt = data.table(expr = c("a + b", "a - b", "a * b", "a / b"), a = c(1,2,3,4), b = c(5,6,7,8)) > dt expr a b 1: a + b 1 5 2: a - b 2 6 3: a * b 3 7 4: a / b 4 8 我的目标是获得以下数据。表: > dt expr a b ans 1: a + b 1 5 6 2: a - b 2
数据。表:
> dt = data.table(expr = c("a + b", "a - b", "a * b", "a / b"), a = c(1,2,3,4), b = c(5,6,7,8))
> dt
expr a b
1: a + b 1 5
2: a - b 2 6
3: a * b 3 7
4: a / b 4 8
我的目标是获得以下数据。表:
> dt
expr a b ans
1: a + b 1 5 6
2: a - b 2 6 -4
3: a * b 3 7 21
4: a / b 4 8 0.5
我尝试了以下方法:
> dt[, ans := eval(expr)]
Error in eval(expr, envir, enclos) : object 'expr' not found
> dt[, ans := eval(parse(text = expr))]
Error in parse(text = expr) : object 'expr' not found
你知道如何根据expr
列中的表达式计算ans
列吗?真的,在这样的设置中,矢量化有很多挑战eval
不希望在表达式向量上运行,默认情况下也不会设置为在环境向量上迭代。在这里,我定义了一个helper函数来包装大部分迭代
calc <- function(e, ...) {
run<-function(x, ...) {
eval(parse(text=x), list(...))
}
do.call("mapply", c(list(run, e), list(...)))
}
dt[, ans:=calc(expr,a=a,b=b)]
如所愿。请注意,您需要在调用calc()
时命名参数,以便它知道要映射到哪个变量的列。如果您的实际表达式描述对矢量化函数的调用,并且每次重复多次,这可能会更有效,因为它只对每个不同的表达式进行一次解析和求值:
f <- function(e, .SD) eval(parse(text=e[1]), envir=.SD)
dt[, ans:=f(expr,.SD), by=expr, .SDcols=c("a", "b")]
# expr a b ans
# 1: a + b 1 5 6.0
# 2: a - b 2 6 -4.0
# 3: a * b 3 7 21.0
# 4: a / b 4 8 0.5
f函数式编程FTW,大+1
f <- function(e, .SD) eval(parse(text=e[1]), envir=.SD)
dt[, ans:=f(expr,.SD), by=expr, .SDcols=c("a", "b")]
# expr a b ans
# 1: a + b 1 5 6.0
# 2: a - b 2 6 -4.0
# 3: a * b 3 7 21.0
# 4: a / b 4 8 0.5