【问题标题】:How to pass an optional argument from Fortran subroutine to a R wrapper如何将可选参数从 Fortran 子例程传递到 R 包装器
【发布时间】:2017-01-11 00:55:42
【问题描述】:

我有一个 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)
}

【问题讨论】:

  • “它没有用”是什么意思?永远不要在问题中使用这个短语,它没有任何意义。它是否返回了一些价值?哪个值?它打印了什么吗?它崩溃了吗?有任何错误信息吗?
  • @VladimirF:感谢您的评论。我将在下一篇文章中记住这一点。收到一条错误消息:“数组错误(x,c(长度(x),1L),if(!is.null(names(x)))list(names( x), : 'data' 必须是向量类型,为 'NULL'"。
  • 您可以编辑您的帖子以包含此信息。
  • @VladimirF:当然。

标签: r fortran wrapper gfortran


【解决方案1】:

更新:将 covmat=as.matrix(covmat) 更改为 covmat=as.vector(covmat) 后没有错误消息。

到目前为止,我为我的问题找到的唯一解决方案是在 .Fortran () 调用中添加一个标志变量以及可选参数,并在子例程中传递这两者。现在的问题是“n”个可选参数,在这种情况下,我将有“nyou will have more flags”。还有其他建议吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 2013-07-06
    • 1970-01-01
    • 2018-01-15
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多