【问题标题】:R store expressions in data.frameR将表达式存储在data.frame中
【发布时间】:2018-03-01 18:48:44
【问题描述】:

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

【问题讨论】:

  • 为什么不分配数字输出矩阵而不是表达式矩阵,以便在循环时可以一次性解决每个表达式,并将输出仅存储在矩阵中?
  • @AdamO 例如,如果我将f(x)=a*x+log(c+d) 绘制在x 之上,我将为每个点重新计算log(x+d)。这个想法是预先计算 AST 的此类早午餐以节省时间。仅仅捕捉数字输出就意味着必须对每个点进行这种预先计算。这样做毫无意义。
  • 这些表达式真的没有共同的结构吗?你不能只捕获一般参数并将它们传递给一个函数(或一组函数)来评估数值输出吗?
  • @AdamO 这些等式是根据来自大量单独块的用户输入生成的。
  • 将用户输入存储为字符?通过解析为表达式进行评估?

标签: r metaprogramming


【解决方案1】:

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

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多