R在data.frame中存储表达式

时间:2018-03-01 18:48:45

标签: r metaprogramming

我有一个计算机生成的方程矩阵。求解每个等式以产生单个数字。然后将得到的数字矩阵馈送到solve函数。为了在变量上绘制结果,必须重复N次。

我想通过修改方程式的AST来加速计算,并在评估之前使用these functions简化它们。

我遇到的问题是我无法在矩阵或data.frame中正确存储类型expressionlanguage的修改方程式。例如:

foo <- data.frame(matrix(expression(NA), nrow = 100, ncol = 100))
# does not work
# apply(foo, MARGIN = c(1,2), function(x) {expression(1+1)})
for (i in c(1:100)) {for (j in c(1:100)) {foo[i,j] <- expression(1+1)}}

结果data.frame foo即使对于最短的表达式也是3.1Mb。实方程甚至更大,并且具有可怕的子集时间。有没有办法有效地存储这些类型?

1 个答案:

答案 0 :(得分:0)

到目前为止,我发现处理这个问题的最佳方法是将表达式存储在函数中。我创建了一个函数:

out <- function() {
  m <- matrix(NA, nrow = 100, ncol = 100)
}

然后我将表达式附加到它:

n <- 3
for (i in c(1:100)) {
  for (j in c(1:100)) {
    body(out)[[n]] <- substitute(m[i, j] <- f+i+j, list(i=i, j=j))
    n <- n + 1
  }
  n <- n + 1
}

最后,我追加return语句并为函数添加参数:

body(out)[[length(body(out))+1]] <- quote(m)
formals(out) <- alist(f=)

为了加快重复评估结果函数的速度,我将其编译为字节码:

outc <- cmpfun(out)

在调用此函数时,返回执行方程的数值矩阵,因此不需要子集。虽然它真的很大。 outoutc均为56Mb。