将递归函数结果保存到R中的全局数据帧
我试图通过在数据帧中保存递归函数的输出,在BaseR中重新创建备忘录包的功能。我有这个函数“P”,然后我制作了这个“metaP”包装器,如果metaP(n)以前没有运行过,它将运行P(n),然后保存P(n)的结果,或者它生成以前保存的输出。我的问题是它只在第一层起作用。如果我运行metaP(5),它将保存metaP(5)的输出,但是为了得到P(5),它还必须计算P(4),而P(4)的结果不会被保存。我假设它在递归环境中丢失了,但是当我尝试使用赋值函数并将其设置为全局环境时,它仍然不起作用 在下面的示例中,我运行Metap5到10,df保存了5到10,但没有保存1到5,其中一些必须经过计算才能得出5到10的答案将递归函数结果保存到R中的全局数据帧,r,R,我试图通过在数据帧中保存递归函数的输出,在BaseR中重新创建备忘录包的功能。我有这个函数“P”,然后我制作了这个“metaP”包装器,如果metaP(n)以前没有运行过,它将运行P(n),然后保存P(n)的结果,或者它生成以前保存的输出。我的问题是它只在第一层起作用。如果我运行metaP(5),它将保存metaP(5)的输出,但是为了得到P(5),它还必须计算P(4),而P(4)的结果不会被保存。我假设它在递归环境中丢失了,但是当我尝试使用赋值函数并将其设置为全局环境时,它仍然不起作用 在下面
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
df这里的问题有点微妙。表情
df <<- rbind(df, data.frame(n = n, pn = P(n)))
(我还建议在测试中添加paren,并将其写为if(!(n%in%df$n))
,因为这两个参数是否相同并不明显。我在前面回答这个问题时对此感到困惑。但检查?语法
表明%in%
的优先级高于!
)将所有数据帧保存到一个列表中,然后执行:do.call(“rbind”,mylist)
以获得一个组合数据帧?这很有意义!至于打字错误,我记得在《地狱》中读到的!n%在%df$n中
和!(n%in%df$n)
以同样的方式计算,即使第一个看起来不应该。我又和他们玩了一次,看起来他们的评价总是一样的。
if (!n %in% df$n) {
newval <- data.frame(n = n, pn = P(n))
df <<- rbind(df, newval)
}