如何将可选参数从 Fortran 子例程传递给 R 包装器

How to pass an optional argument from Fortran subroutine to a R wrapper

我有一个在调用中使用可选参数的 Fortran 子例程。

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)
}

更新:将covmat=as.matrix(covmat)改为covmat=as.vector(covmat).

后没有报错信息

到目前为止,我为我的问题找到的唯一解决方案是在 .Fortran () 调用中添加一个标志变量和可选参数,并将两者都传递到子例程中。现在的问题是 'n' 可选参数,在这种情况下我会让你有更多的标志。还有其他建议吗?