#r #csv #plot #interop #fortran
#r #csv #график #взаимодействие #fortran
Вопрос:
В настоящее время я выполняю большой объем анализа данных в Fortran. Я использовал R для построения большинства своих результатов, поскольку Fortran плохо подходит для визуализации. До сих пор наборы данных были двумерными и довольно маленькими, поэтому мне удавалось обходиться подпрограммами, которые записывают данные, подлежащие построению, и различные параметры графика в файл .CSV, а также с помощью системного вызова для запуска R-скрипта, который считывает файл и генерируеттребуется график.
Тем не менее, я обнаружил, что сейчас имею дело с несколько большими наборами 3D-данных, и я не знаю, смогу ли я продолжать в том же духе (в частности, отправка и правильное чтение в 3D-массиве через .CSV довольно сложнее и занимает много избыточной памяти, что является проблемой, учитываяразмер наборов данных).
Кто-нибудь знает какой-нибудь эффективный способ отправки данных из Fortran в R? Единственная утилита, которую я нашел для этого (RFortran), доступна только для Windows, а мой рабочий компьютер — mac. Я знаю, что R обладает элементарным интерфейсом Fortran, но я вызываю R из Fortran, а не наоборот, и, кроме того, учитывая количество параметров графика, которые я отправляю (метки осей, заголовки графиков, единицы измерения и ограничения оси и т. Д., Многие из которых являются необязательными и имеют значения по умолчанию втекущие процедуры, которые я использую) Я не уверен, что у него есть необходимые мне функции.
Комментарии:
1. Вы пытались записать свои данные в двоичном формате?
2. Я еще не пробовал это, хотя я рассматривал это.
3. Сможете ли вы вызвать функцию Fortran напрямую из R?
4. Роман намекает на: cran.r-project.org/doc/manuals/r-release /…
5. Оказывается, что функции двоичного чтения в R вполне применимы и, поскольку и R, и Fortran являются основными для столбцов, отправляют большие массивы через. двоичный формат требует всего по пять строк кода на каждом конце. Итак, я продолжаю с этим. Спасибо.
Ответ №1:
Я бы предпочел записывать NetCDF
файлы из Fortran. Эти файлы могут содержать большие объемы многомерных данных. Существуют также хорошие привязки для создания файлов NetCDF в Fortran (он часто используется в климатических моделях). Кроме того, R имеет отличную поддержку для работы с файлами NetCDF в виде ncdf
пакета. Например, очень легко считывать только небольшую часть куба данных в память (только некоторые временные интервалы или некоторый географический регион). Наконец, NetCDF работает на всех платформах.
С точки зрения рабочего процесса, я бы позволил программе fortran генерировать файлы NetCDF плюс некоторые графические параметры в отдельном файле ( data.nc
и data.plt
, например), а затем в качестве шага последующей обработки вызвать R. Таким образом, вам не нужно напрямую взаимодействовать с R и Fortran. Управление всем рабочим процессом может выполняться отдельным скриптом (например, Python), который вызывает модель Fortran, составляет список файлов NetCDF / .plt и создает графики.
Ответ №2:
Итак, получается, что отправка массивов через. неформатировать файлы между Fortran и R тривиально просто. Оба являются основными по столбцам, поэтому нужно всего лишь передать неформатированный файл, содержащий массив, и другой, содержащий информацию о форме и размере массива, а затем прочитать данные непосредственно в массив правильного размера и формы в R.
Пример кода для n-мерного массива целых чисел, a, с размером i, имеющим размер s (i).
На стороне Fortran (для доступа должно быть установлено значение «поток», иначе после каждой записи будут вставляться дополнительные байты):
open(unit = 1, file="testheader.dat", form="unformatted", access="stream", status="unknown")
open(unit = 2, file="testdata.dat", form="unformatted", access="stream", status="unknown")
write(1) n
do i=1,n
write(1) s(i)
enddo
write(2) a
R-side (убедитесь, что у вас правильный порядковый номер, иначе это приведет к плачевному завершению):
testheader = file("testheader.dat", "rb")
testdata = file("testdata.dat", "rb")
dims <- readBin(testheader, integer(), endian="big")
sizes <- readBin(testheader, integer(), n=dims, endian="big")
dim(sizes) <- c(dims)
a <- readBin(testdata, integer(), n=prod(sizes), endian="big")
dim(a) <- sizes
При желании вы можете поместить заголовок и данные в один файл.