R 在 data.frame 中存储表达式

R store expressions in data.frame

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

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

我遇到的问题是我无法在矩阵或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。真正的方程式更大,并且有糟糕的子集时间。有没有办法有效地存储这些类型?

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

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)

调用此函数后 returns 执行方程的数字矩阵,因此不需要子集化。虽然它真的很大。 outoutc 都是 56Mb。