У меня есть модель, которая выводит данные в виде 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() выполняет функции в качестве своего входа, а затем запускает функцию для получения ее значений, и переписывание этой функции сейчас не находится в таблице. Я не передаю данные непосредственно из своей модели в функцию анализа, потому что моя модель занимает несколько часов, и я хочу, чтобы она могла претерпеть много испытаний и проанализировать их позже.
Попробуйте i = i + 1 вместо i << - – akaDrHouse
@akaDrHouse У меня сложилось впечатление, что использование «=» для назначения переменных считается плохим стилем в R, причем «<-» предпочтительнее. В любом случае это не сработает. Использование «<-» или «=» заставляет функцию смотреть на 0.csv каждый раз, когда она запускается, потому что приращение не выходит за рамки текущего прогона. –
Использование глобального присвоения широко считается * плохой практикой *. Он изменяет порядок работы вашего кода и то, как вы архитектируете вещи. '<-' vs' = '- это предпочтение стиля *, которое, за исключением одного или двух крайне редких случаев, не изменяет того, что делает ваш код, только изменяет то, на что оно похоже. – Gregor