[R] Fortran Code to R Code
Dave Roberts
droberts at montana.edu
Wed Nov 28 18:54:51 CET 2007
Bryan,
The previous responses will point you in the right direction. I
have found, however, that it takes a while to get used to the
requirements, and there are many possible sources of error.
1) You have to convert the main program to a subroutine. Any arrays
declared in the main program or any nested subroutine have to created in
R before the subroutine is called, and passed to the subroutine. On the
other hand, this provides the advantage of allocatable array size in
FORTRAN 77.
2) You have to make sure that you are very careful about storage. I
have reluctantly decided that attempting minimize storage by using
integer*2 and real*4 is not worth it, and I now use just integer and
double precision to minimize problems with R.
3) Consider casting every variable passed in the .Fortran() call. Many
of them would be correct by default possibly, but it is easier to simply
cast them all, e.g. as.integer() for all integers, as.double() for real
numbers. These get the storage right, and strip of any attributes
besides he actual values. Fortunately, R and FORTRAN agree about
storage order in arrays and you don't have to micro-manage that.
4) When you get it wrong, the probability of a seg fault and hard crash
is very high. So, every time you modify the R function that calls the
.Fortran you have written, do a save.image() before you try the code.
Otherwise you lose all your changes. If you have the luxury of working
in linux (and presumably other *nixes), you can use "write(6,*)
whatever" debug statements in your code and the output goes to your R
session. In Windows, you have to use the specific debug routines
described in the R manuals.
5) Managing the returned values has to handled in the .Fortran() call by
giving the argument a name. Then, that name can be used as the
component name of the returned object. Just below is an example from
labdsv that converts any dissimilarity or distance matrix to the nearest
euclidean distance object. The PACKAGE= argument is used when the
routine is pat of a package; it's not necessary for ad hoc functions.
euclidify <- function (x,upper=FALSE,diag=FALSE)
{
x <- as.dist(x)
tmp <- .Fortran("euclid",
x=as.matrix(x),
as.integer(attr(x,"Size")),
PACKAGE='labdsv')
tmp2 <- as.dist(tmp$x)
attr(tmp2, "Labels") <- dimnames(x)[[1]]
attr(tmp2, "Diag") <- diag
attr(tmp2, "Upper") <- upper
attr(tmp2, "method") <- paste("euclidify", attr(x, "method"))
attr(tmp2, "call") <- match.call()
tmp2
}
Dave Roberts
Bryan Klingaman wrote:
> How do you convert Fortran Code to R Code to use and execute in R? Or how do you take Fortran code and make it run in R? So what I'm getting at is, I have some code in fortran and I want to be able to run that same code for R. Please email me back and let me know how to do that, thanks.
>
> Bryan
> Email: BKling9er at yahoo.com
>
>
> ---------------------------------
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> 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.
>
>
More information about the R-help
mailing list