Модульное тестирование с помощью `testthat` функций, которые пишут / читают файлы, или ошибка Fortran

Как лучше всего проводить модульное тестирование testthat функций, которые читают и записывают файлы?

Приносим извинения за сложный вопрос, но я не уверен, что здесь не так.

Я реализовал ряд функций в Фортране, который читает и записывает файлы. Они скомпилированы в пакете R cf. Написание руководства по расширению R. Мое модульное тестирование с testthat генерирует случайный контент, который записывается во временные файлы с помощью tempfile (). Выполнение проверки R CMD в пакете R работает на моем локальном компьютере с Windows.

Однако запуск с R-devel завершается ошибкой, потому что он не может обнаружить Rtools для R-3.5.0 (devel). Итак, я подал заявку на участие в win-builder.

Однако http://win-builder.r-project.org/ не работает со следующим ошибка:

  At line 9 of file auxil.f95
Fortran runtime error: Actual string length is shorter than the declared one for dummy argument 'fn' (96/255)

с соответствующим источником на Фортране:

subroutine get_nlines(fn, nlines, stat) !line 9
  implicit none

  !! Arguments
  character(255), intent(in) :: fn
  integer, intent(out) :: nlines, stat

  !! Local variables
  character(len=1) :: one

  nlines = 0
  open(40, file=fn, status='OLD')
  do
    read(40, *, iostat=stat) one
    if (stat /= 0) exit
    nlines = nlines + 1
  end do
  close(40)

end subroutine

Код Fortran хранится в подкаталоге src пакета R и вызывается с помощью

get_nlines <- function(fn) {
  stopifnot(file.exists(fn))
  res <- .Fortran('get_nlines', fn=as.character(fn), nlines=integer(1), stat=integer(1))
  if (res$nlines == 0 & res$stat != 0) {
    warning(paste0('get_nlines did not read lines; IOSTAT error ', res$stat, '.'))
    return(structure(NA, code=res$stat))
  }
  res$nlines
}

Итак, вот оно. Я не знаю, неправильный ли мой код Fortran или что-то происходит на сервере win-builder.


person MrGumble    schedule 12.09.2017    source источник
comment
Где ваш код на Фортране? Как вы называете эту подпрограмму? То, что вы показываете, просто не завершено.   -  person Vladimir F    schedule 12.09.2017
comment
Хорошо, а что вы передаете как fn этому коду R? Пожалуйста, нам нужно увидеть, откуда это взялось. На самом деле этого недостаточно. Мы просто знаем, что fn должен содержать 255 символов.   -  person Vladimir F    schedule 12.09.2017
comment
Как позвонить testthat? Как выглядит код, вызывающий указанную ошибку? Нам просто не хватает кода, вызывающего ошибку.   -  person Vladimir F    schedule 12.09.2017
comment
fn - это вектор символов, возвращаемый из tempfile(), и содержит путь к имени файла. testthat вызывается с использованием test_check(<packagename>).   -  person MrGumble    schedule 12.09.2017
comment
Чем fn должно быть 255 символов. Почему написано именно так, а не как character(*) Понятия не имею.   -  person Vladimir F    schedule 12.09.2017


Ответы (1)


«Я не знаю, ошибочен ли мой код Fortran» Я все еще просто не понимаю из вашего вопроса, является ли код, который вы показали, «вашим» кодом или он находится внутри какого-то пакета R ты используешь.

Если вы говорите о коде Fortran (вы ничего не показали), тогда вам следует попробовать character(*) вместо character(255), потому что нет очевидной причины для точной фиксированной длины 255. Это именно то, на что жалуется сообщение об ошибке о том, что fn - это не совсем 255 символов, как вам нужно в get_nlines().

person Vladimir F    schedule 13.09.2017
comment
Я использовал character(255), поскольку это символ (максимальной) длины, который R может передавать в Фортран и из него. - person MrGumble; 13.09.2017
comment
Не очень удачный выбор, даже если такой максимум есть, здесь он не актуален. - person Vladimir F; 13.09.2017
comment
Спасибо за совет, в котором вы не можете понять, что и почему это плохой выбор. Использование символьной переменной предполагаемой длины (character(*)) только ухудшило ситуацию, поскольку строки, полученные Фортраном, были неправильно обрезаны. Сейчас я попытаюсь сделать обратное; заполнение всех строк до 255 символов пробелом. - person MrGumble; 13.09.2017
comment
Извините, но для такой иронии нет повода. Я пытался помочь, но помогай себе. - person Vladimir F; 13.09.2017