【发布时间】:2020-04-26 10:49:46
【问题描述】:
我试图通过将递归函数的输出保存在数据框中来重新创建基础 R 中的 memoise 包的功能。我有这个函数“P”,然后我制作了这个“metaP”包装器,如果之前没有运行过 metaP(n),它将运行 P(n),然后保存 P(n) 的结果,或者它产生以前的保存的输出。我的问题是它只适用于第一级。如果我运行 metaP(5),它将保存 metaP(5) 的输出,但为了得到 P(5),它还必须计算 P(4),并且 P(4) 的结果没有得到保存。我假设它在递归环境中丢失了,但是当我尝试使用 assign 函数并将其设置为全局环境时,它仍然不起作用。
在下面的示例中,我运行 metaP 5 到 10,df 保存了 5 到 10,但它没有保存 1 到 5,其中一些必须经过计算才能得出 5 到 10 的答案10.
df <- data.frame(n = 0, pn = 1)
metaP <- function(n) {
if (!n %in% df$n) df <<- rbind(df, data.frame(n = n, pn = P(n)))
df[df$n == n, "pn"]
}
P <- function(n) {
if (n < 0) return(0)
k <- rep(1:((sqrt(24 * n + 1) + 1) / 6), each = 2) * c(1, -1)
return(sum((-1) ^ (k + 1) * sapply(n - k * (3 * k - 1) / 2, metaP)) %% 1e6)
}
sapply(5:10, metaP)
df
【问题讨论】:
-
将所有数据帧保存到一个列表中,然后执行:
do.call("rbind", mylist)以获得组合数据帧?
标签: r