R 在 data.frame 中存储表达式
R store expressions in data.frame
我有一个计算机生成的方程矩阵。求解每个方程以产生一个数字。然后将生成的数字矩阵馈送到 solve
函数。要在变量上绘制结果,必须重复 N 次。
我想通过修改方程式的 AST 来加快计算速度,并在计算之前使用 简化它们。
我遇到的问题是我无法在矩阵或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。真正的方程式更大,并且有糟糕的子集时间。有没有办法有效地存储这些类型?
到目前为止,我发现处理此问题的最佳方法是将表达式存储在函数中。我创建一个函数:
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 执行方程的数字矩阵,因此不需要子集化。虽然它真的很大。 out
和 outc
都是 56Mb。
我有一个计算机生成的方程矩阵。求解每个方程以产生一个数字。然后将生成的数字矩阵馈送到 solve
函数。要在变量上绘制结果,必须重复 N 次。
我想通过修改方程式的 AST 来加快计算速度,并在计算之前使用
我遇到的问题是我无法在矩阵或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。真正的方程式更大,并且有糟糕的子集时间。有没有办法有效地存储这些类型?
到目前为止,我发现处理此问题的最佳方法是将表达式存储在函数中。我创建一个函数:
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 执行方程的数字矩阵,因此不需要子集化。虽然它真的很大。 out
和 outc
都是 56Mb。