R 中的闭包问题 returns .csv 文件

Issues in R with closures that sequentially returns .csv files

我有一个以 .csv 文件形式输出数据的模型。输出目录充满了 .csv 文件,每个文件都命名为 n.csv,其中 n 是 运行 数字。所以第 0 天 运行 它创建 0.csv,第 1 天 运行 它创建 1.csv,等等

现在我想在 R 中分析这些数据,并将其与另一个模型的输出进行比较。我写了一个函数,运行 是我希望在两个模型上进行的分析,作为输入函数给出。我要比较的模型是一个内置的 sna 函数,为了制作一个模拟我的模型的函数,我编写了以下闭包

#creates a model function that returns sequentially numbered .csv files from a directory
make.model <- function(dir) {
  i <- -1 # allows for starting the .csv ennumeration at 0
  model <- function() {
    i <<- i + 1
    my.data <- as.matrix(read.csv(paste0(dir, i, ".csv"), header=FALSE))
    return(my.data)
  }
  return(model)
}

我运行关注的问题是,虽然

my.model <- make.model(directory)
spectral.analysis(my.model, other.model, observed.data, nsim = 100)

完全符合我的要求,并计算我的模型和其他模型在对观察到的数据建模方面的表现,它不可重复使用。闭包内的计数器会永久向上勾选,因此该函数在尝试访问不存在的 .csv 文件之前只能 运行 多次。

我目前正在使用一个 "reset" 函数来解决这个问题,该函数重新定义 my.model 并在每次使用 my.model 后将其 运行 重新定义,这似乎是一个非常解决方案不佳。

有没有更聪明的方法来做到这一点?至关重要的是,函数 spectral.analysis() 将函数作为其输入,然后 运行s 函数获取它的值,并且重写该函数现在不在 table 上。我没有将数据直接从我的模型传递到分析函数,因为我的模型需要几个小时才能 运行,所以我希望能够预先 运行 进行大量试验并在以后进行分析。

Self-answering 关闭,我在评论的帮助下弄明白了。

length(list.files(pattern=".csv"))

允许您获取 .csv 文件的数量,因此将增加 i 的行更改为 read

i <<- (i + 1) %% length(list.files(pattern=".csv"))

解决问题。