2016-09-02 4 views
0

호출시 선택적 인수를 사용하는 Fortran 서브 루틴이 있습니다. Fortran 서브 루틴에서 R 래퍼로 선택적 인수를 전달하는 방법

subroutine data (n,ns,alpha,covmat,x,y) 

integer, intent(in):: n,ns 
double precision, intent(in) :: alpha 
double precision, intent(in), optional ::covmat(n,ns) 
double precision, intent(out) :: x(n),y(n) 
.... 
end subroutine data 

나는이 서브 루틴에 대해 다음과 R 래퍼를 시도하고 오류 메시지가 있어요 :

Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x), : 
'data' must be of a vector type, was 'NULL' 

내가 제대로 .Fortran() 호출에 인수를 전달하면 잘 모르겠어요합니다. 나는 온라인으로 유용한 것을 찾을 수 없었다.

data1 <- function(n,ns,alpha,covmat=NULL){ 

tmp <- .Fortran("data", 
n = as.integer(n),ns= as.integer(ns) 
alpha=as.numeric(alpha),covmat=as.vector(covmat), 
x=as.double(rep(0,n)),y=as.double(rep(0,n))) 
) 
} 
result <- list(x=tmp$x, y=tmp$y) 

return(result) 
} 
+0

"작동하지 않았다"는 것은 무엇을 의미합니까? 질문에이 문구를 사용하지 마십시오. 아무 의미도 없습니다. 어떤 가치를 되찾았습니까? 어떤 가치가 있습니까? 뭔가 인쇄 했습니까? 충돌 했나요? 오류 메시지가 있습니까? –

+0

@VladimirF : 의견을 주셔서 감사합니다. 나는 다음 게시물에 대해 염두에두고 있습니다. 오류 메시지가 나타납니다 : "배열에 오류가 있습니다 (x, c (length (x), 1L), if (! is notnull (names (x))) list x), : '데이터'는 벡터 형식이어야하며 'NULL'입니다. " – Vineetha

+0

이 정보를 포함하도록 게시물을 편집 할 수 있습니다. –

답변

0

업데이트 : = as.vector (covmat를) covmat하는 covmat = as.matrix (covmat)을 변경 한 후 오류 메시지가 없습니다.

지금까지 내 질문에 대한 유일한 해결책은 .Fortran() 호출에서 선택적 인수와 함께 플래그 변수를 추가하고 서브 루틴에서 모두 전달하는 것입니다. 문제는 이제 'n'선택적 인수에 대한 것입니다.이 경우 더 많은 플래그를 갖게됩니다. 다른 제안?

관련 문제