R中的问题与闭包顺序返回.csv文件

时间:2017-01-12 19:20:11

标签: r csv closures scoping

我有一个以.csv文件形式输出数据的模型。输出目录中包含.csv文件,每个文件名为n.csv,其中n是运行编号。所以在第0次运行时它会创建0.csv,在第一次运行时会创建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文件之前,该函数只能运行很多次。

我目前正在使用&#34;重置&#34;在每次使用my.model之后重新定义my.model并运行它的函数,这似乎是一个非常糟糕的解决方案。

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

1 个答案:

答案 0 :(得分:0)

自我回答结束,我在评论的帮助下弄清楚了。

HashMap

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

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

解决了这个问题。