2017-09-12 4 views
1

Was ist der beste Weg, Unit-Tests mit testthat auf Funktionen zum Lesen und Schreiben von Dateien zu machen?Unit-Test mit `testthat` auf Funktionen, die Dateien schreiben/lesen, oder einen Fortran-Fehler

Entschuldigung für eine komplizierte Frage zu stellen, aber ich bin mir nicht sicher, was hier falsch ist.

Ich habe in Fortran eine Reihe von Funktionen implementiert, die Dateien lesen und schreiben. Sie sind in einem R-Paket zusammengestellt, vgl. Schreiben R Erweiterung Handbuch. Mein Unit-Test mit testthat generiert zufälligen Inhalt, der mit tempfile() in temporäre Dateien geschrieben wird. Running R CMD-Prüfung für das R-Paket funktioniert auf meinem lokalen Windows-Rechner.

Das Ausführen mit R-devel schlägt jedoch fehl, weil Rtools für R-3.5.0 (devel) nicht erkannt werden kann. Also habe ich mich dem Win-Builder unterzogen.

http://win-builder.r-project.org/ scheitert jedoch mit dem folgenden Fehler:

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) 

mit Fortran Quelle entspricht:

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-Code im src Unterverzeichnis des R-Pakets gespeichert ist, und wird als mit

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 
} 

So ist es. Ich weiß nicht, ob mein Fortran-Code falsch ist oder ob etwas auf dem Win-Builder-Server auftritt.

+0

Wo ist Ihr Fortran-Code? Wie nennst du diese Subroutine? Was du zeigst, ist einfach nicht vollständig. –

+0

OK, und was gibst du als 'fn' an diesen R-Code? Bitte, wir müssen sehen, woher diese Dinge kommen. Wirklich, das ist * nicht * genug. Wir wissen nur, dass 'fn' 255 Zeichen haben muss. –

+0

Wie nennt man 'testthat'? Wie sieht der Code aus, der den angezeigten Fehler verursacht? Uns fehlt einfach jeder Code, der den Fehler verursacht. –

Antwort

0

"Ich weiß nicht, ob mein Fortran-Code falsch ist" Ich verstehe immer noch nicht von Ihrer Frage, ob der Code, den Sie gezeigt haben, "der" Code ist oder wenn er in einem R-Paket enthalten ist benutzen.

Wenn es der Fortran-Code ist über Sie sprechen (Sie nichts anderes zeigen, haben), dann sollten Sie versuchen character(*) statt character(255), weil es kein ersichtlicher Grund für die genaue feste Länge ist 255. das ist genau das, was Die Fehlermeldung beschwert sich darüber, dass fn nicht genau 255 Zeichen lang ist, wie Sie in get_nlines() benötigen.

+0

Ich habe 'character (255)' verwendet, da dies das (maximale) Längenzeichen ist, das R an und von Fortran übergeben kann. – MrGumble

+0

Es ist keine gute Wahl, auch wenn es ein solches Maximum gibt, ist es hier nicht relevant. –

+0

Danke für den Rat, wo Sie keinen Einblick darauf geben, was oder warum es eine schlechte Wahl ist. Die Verwendung einer Zeichenvariable mit angenommener Länge ('character (*)') machte es nur noch schlimmer, da die Strings, die Fortran erhielt, falsch abgeschnitten wurden. Ich werde jetzt versuchen, das Gegenteil zu tun; Auffüllen aller Zeichenfolgen mit Leerzeichen auf 255 Zeichen. – MrGumble

Verwandte Themen