2017-01-12 11 views
0

У меня есть модель, которая выводит данные в виде CSV-файлов. Выходной каталог заполнен .csv-файлами, каждый из которых называется n.csv, где n - номер запуска. Итак, на 0-м запуске он создает 0.csv, на 1-м запуске он создает 1.csv и т. Д.Проблемы в R с закрытием, которые последовательно возвращают файлы .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.

В настоящее время я обойду это с помощью функции «перезагрузки», которая переопределяет my.model и запускает ее после каждого использования my.model, это кажется очень плохим решением.

Есть ли более умный способ сделать это? Принципиально функция spectral.analysis() выполняет функции в качестве своего входа, а затем запускает функцию для получения ее значений, и переписывание этой функции сейчас не находится в таблице. Я не передаю данные непосредственно из своей модели в функцию анализа, потому что моя модель занимает несколько часов, и я хочу, чтобы она могла претерпеть много испытаний и проанализировать их позже.

+1

Попробуйте i = i + 1 вместо i << - – akaDrHouse

+0

@akaDrHouse У меня сложилось впечатление, что использование «=» для назначения переменных считается плохим стилем в R, причем «<-» предпочтительнее. В любом случае это не сработает. Использование «<-» или «=» заставляет функцию смотреть на 0.csv каждый раз, когда она запускается, потому что приращение не выходит за рамки текущего прогона. –

+1

Использование глобального присвоения широко считается * плохой практикой *. Он изменяет порядок работы вашего кода и то, как вы архитектируете вещи. '<-' vs' = '- это предпочтение стиля *, которое, за исключением одного или двух крайне редких случаев, не изменяет того, что делает ваш код, только изменяет то, на что оно похоже. – Gregor

ответ

0

Самостоятельно ответить, я понял это с помощью комментариев.

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

Позволяет получить количество файлов .csv, поэтому изменение линии, где я увеличивается читать

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

решает эту проблему.