Kodalore Vijayan, Vineetha W
2016-Sep-06 19:51 UTC
[R] Pass an optional argument from Fortran subroutine to a R wrapper
Hello, I have a Fortran subroutine which uses an optional argument in the call. 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 I tried the following R wrapper for this subroutine and got an error saying, 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' I'm not sure if I passed the arguments correctly in the .Fortran() call. I couldn't find anything helpful online. I would really appreciate any help/comments. data1 <- function(n,ns,alpha,covmat=NULL){ tmp <- .Fortran("data", n = as.integer(n),ns= as.integer(ns) alpha=as.numeric(alpha),covmat=as.matrix(covmat), x=as.double(rep(0,n)),y=as.double(rep(0,n))) ) } result <- list(x=tmp$x, y=tmp$y) return(result) } Thanks, Vineetha [[alternative HTML version deleted]]
Erin Hodgess
2016-Sep-07 09:56 UTC
[R] Pass an optional argument from Fortran subroutine to a R wrapper
Hello! You can't really pass the matrix as a matrix. Send it as a vector, re-construct it in the Fortran program. Actually, if it's a covariance matrix and symmetric, you may be able to get away with just sending part of the matrix. For example, if you have the following: covmat<- matrix(c(1,0.9,0.81,0.9,1,0.9,0.81,0.9,1),nrow=3,ncol=3,byrow=TRUE) cov1 <- covmat[1:3] Then pass cov1 as a numeric. It's easier and faster to manipulate your covariance matrix in the Fortran program. Hope this helps. Sincerely, Erin On Tue, Sep 6, 2016 at 2:51 PM, Kodalore Vijayan, Vineetha W <vwkv13 at mun.ca> wrote:> Hello, > > I have a Fortran subroutine which uses an optional argument in the call. > > 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 > > I tried the following R wrapper for this subroutine and got an error > saying, > > 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' > > I'm not sure if I passed the arguments correctly in the .Fortran() call. I > couldn't find anything helpful online. I would really appreciate any > help/comments. > > data1 <- function(n,ns,alpha,covmat=NULL){ > > tmp <- .Fortran("data", > n = as.integer(n),ns= as.integer(ns) > alpha=as.numeric(alpha),covmat=as.matrix(covmat), > x=as.double(rep(0,n)),y=as.double(rep(0,n))) > ) > } > result <- list(x=tmp$x, y=tmp$y) > > return(result) > } > > Thanks, > Vineetha > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/ > posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Erin Hodgess Associate Professor Department of Mathematical and Statistics University of Houston - Downtown mailto: erinm.hodgess at gmail.com [[alternative HTML version deleted]]