#r #nested-loops
#r #вложенные циклы
Вопрос:
Список наборов данных, которые я использую:- 1. файлы климатических данных .nc 2. Список городов (53) с широтой и долготой для извлечения данных из файла .nc 3. Рабочий код:- Мне удалось получить данные для 53 городов с помощью цикла magic_for.Итак, в настоящее время я могу сохранить путь к файлу .nc и извлекать ежедневные значения таких переменных, как tasmin, tasmax, pr и tas, с помощью функции magic_for. Каждый из этих файлов содержит данные за период с 2006 по 2100 год для одной переменной. 4. Проблема: — Теперь для модели, в которой у меня есть 19 файлов .nc (по 5 лет каждому), в отличие от предыдущего 1 файла (95 лет). Следовательно, я хочу использовать рабочую программу, как упомянуто выше, для запуска девятнадцать раз. 5. Код:- Работает:
tasfilepath<-paste0("path.nc")
model1<-nc_open(tasfilepath)
lonmodel1<-ncvar_get(model1, varid = 'lon')
latmodel1<-ncvar_get(model1, varid = 'lat')
timemodel1<-nc.get.time.series(model1, v="tasmin", time.dim.name = "time")
input<-read.xlsx(file = "cities_1.xlsx", sheetName = "Sheet1")
i<-length(col(input[1]))
magic_for(print1, silent = TRUE)
for (j in 1:i)
{
alat<-which.min(abs(latmodel1-input[j,2]))
alon<-which.min(abs(lonmodel1-input[j,3]))
temp<-nc.get.var.subset.by.axes(model1, "tasmin", axis.indices = list(X=alon, Y=alat))
print1(temp)
}
df0<-magic_result_as_dataframe()
Не работает:
input0<-read.xlsx(file = "sheet with path addresses of .nc files.xlsx")
i0<-length(col(input0[1]))
magic_for(print2, silent = TRUE)
for(k in 1:i0)
{
tasfilepath<-paste0(input0[k,2])
model1<-nc_open(tasfilepath)
lonmodel1<-ncvar_get(model1, varid = 'lon')
latmodel1<-ncvar_get(model1, varid = 'lat')
timemodel1<-nc.get.time.series(model1, v="tasmin", time.dim.name = "time")
input<-read.xlsx(file = "cities_1.xlsx", sheetName = "Sheet1")
i<-length(col(input[1]))
magic_for(print1, silent = TRUE)
for (j in 1:i)
{
alat<-which.min(abs(latmodel1-input[j,2]))
alon<-which.min(abs(lonmodel1-input[j,3]))
temp<-nc.get.var.subset.by.axes(model1, "tasmin", axis.indices = list(X=alon, Y=alat))
print1(temp)
}
df0<-magic_result_as_dataframe()
print2(df0)
}
df1<-magic_result_as_dataframe()
Ошибка — Ошибка в (function (…, row.names = NULL, проверьте.строки = FALSE, check.names = TRUE, : аргументы подразумевают разное количество строк: 53, 19
Альтернативы:
Даже если бы я мог создать 19 фреймов данных и связать их вместе, моя проблема была бы решена.
С уважением
Комментарии:
1. Это слишком много для обработки в течение 8:22. Вы пробовали добавлять
browser()
вызов перед строкой с подозрением на нарушение и проверять результат?2. Привет, Роман, я не пользовался браузером (). Не могли бы вы поделиться ссылкой или объяснить подробнее. В любом случае я читаю документацию r по нему.
3. Существует множество ресурсов для изучения отладки в R. Вот один из них: adv-r.hadley.nz/debugging.html#browser