【发布时间】:2018-03-01 18:48:44
【问题描述】:
我有一个计算机生成方程的矩阵。每个方程都被求解以产生一个数字。然后将生成的数字矩阵馈送到solve 函数。要在变量上绘制结果,必须重复 N 次。
我想通过修改方程的 AST 来加快计算速度,并在评估之前使用 these functions 简化它们。
我遇到的问题是我无法在矩阵或 data.frame 中正确存储 expression 或 language 类型的修改方程。例如:
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