将递归函数结果保存到R中的全局数据帧

将递归函数结果保存到R中的全局数据帧,r,R,我试图通过在数据帧中保存递归函数的输出,在BaseR中重新创建备忘录包的功能。我有这个函数“P”,然后我制作了这个“metaP”包装器,如果metaP(n)以前没有运行过,它将运行P(n),然后保存P(n)的结果,或者它生成以前保存的输出。我的问题是它只在第一层起作用。如果我运行metaP(5),它将保存metaP(5)的输出,但是为了得到P(5),它还必须计算P(4),而P(4)的结果不会被保存。我假设它在递归环境中丢失了,但是当我尝试使用赋值函数并将其设置为全局环境时,它仍然不起作用 在下面

我试图通过在数据帧中保存递归函数的输出,在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的答案

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)
}