2017-09-12 5 views
1

파일을 읽고 쓰는 함수에서 testthat으로 단위 테스트를하는 가장 좋은 방법은 무엇입니까?파일을 쓰거나 읽는 함수, 또는 포트란 오류에서`testthat`를 이용한 단위 테스트

복잡한 질문을하는 것에 사과드립니다.하지만 여기서 무엇이 잘못 됐는지 확신 할 수 없습니다.

저는 Fortran에서 파일을 읽고 쓰는 많은 기능을 구현했습니다. 그들은 R 패키지 cf로 컴파일됩니다. R 확장 매뉴얼 작성. testthat으로 단위 테스트를 수행하면 tempfile()을 사용하여 임시 파일에 기록되는 임의의 콘텐츠가 생성됩니다. R 패키지에서 R CMD 확인 실행은 로컬 Windows 컴퓨터에서 작동합니다.

R-devel을 사용하여 실행하는 것은 R-3.5.0 (devel) 용 Rtools를 감지 할 수 없기 때문에 실패합니다. 그래서 우승자에게 제출했습니다. 포트란 소스 대응

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) 

:

http://win-builder.r-project.org/ 그러나 다음 오류 실패 포트란 코드 R 패키지 src 서브 디렉토리에 저장된다

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 

, 그리고

불려
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 서버에서 발생하는 문제인지 알 수 없습니다.

+0

포트란 코드는 어디에 있습니까? 그 서브 루틴을 어떻게 부르니? 당신이 보여주는 것은 단순히 완전하지 않습니다. –

+0

OK, 그 R 코드에'fn'으로 무엇을 전달합니까? 제발, 우리는 그 것들이 어디에서 왔는지 볼 필요가 있습니다. 실제로, 이것은 * 충분하지 않습니다. 'fn'에는 255 문자가 있어야한다는 것을 알고 있습니다. –

+0

어떻게'testthat'라고 부르시겠습니까? 오류를 발생시키는 코드는 어떻게 보이나요? 오류의 원인이되는 코드가 누락되었습니다. –

답변

0

"내 포트란 코드가 잘못된 것인지 잘 모르겠다" 표시된 코드가 "해당"코드이거나 일부 R 패키지에 포함되어있는 경우 귀하의 질문에서 이해할 수 없습니다. 사용하고 있습니다.

말하고있는 포트란 코드 인 경우 (다른 것을 표시하지 않은 경우) character(255) 대신 character(*)을 시도해야합니다. 정확히 고정 길이 255에 대한 이유가 없기 때문입니다. 정확히 무엇입니까? 오류 메시지는 fn이 정확히 255 자 길이가 아니며 get_nlines()에 필요하다는 것을 알립니다.

+0

저는 R이 Fortran과주고받을 수있는 (최대) 길이 문자이기 때문에'character (255)'를 사용했습니다. – MrGumble

+0

좋은 선택이 아니며, 최대 값이 있더라도 여기에는 관련이 없습니다. –

+0

조언을 주셔서 감사합니다. 귀하는 왜 또는 무엇이 나쁜 선택인지에 대한 통찰력을 제공하지 않습니다. 가정 된 길이의 문자 변수 ('character (*)')를 사용하면 Fortran이받은 문자열이 잘못 잘라져서 더 나빠졌습니다. 나는 지금 반대를 시도 할 것이다. 모든 문자열을 공백으로 255 자로 채 웁니다. – MrGumble