R在data.frame中存储表达式

问题描述 投票:0回答:1

我有一个计算机生成的方程矩阵。求解每个等式以产生单个数字。然后将得到的数字矩阵馈送到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。实方程甚至更大,并且具有可怕的子集时间。有没有办法有效地存储这些类型?

r metaprogramming
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.