On Thu, 14 May 2009, Seija Sirkiä wrote:
Hello all,
it seems my efforts in reading the manuals and help files aren't enough so
here I am. The question is, how would I go about linking a pre-compiled DLL
in to my package? I have previously successfully built packages with Fortran
and C source code, but now I'd like to take this ready made DLL and call its
routines from R.
My collegue was brave enough to simply try and put the DLL in src folder of
the package and proceed with building and installing the same way as if it
had been source code. And it works, on my computer and his. Clearly this
isn't exactly portable, and while that's ok for the use we have in mind (we
both work on Windows XP) I have a nagging feeling this is somehow criminal or
unwise at least.
Unwise, since it is unsupported and might stop working at any time.
Actually, you don't mention the version of R you used and (without
checking) I think this may not work in all recent versions of R.
What you can so is to have an 'inst/libs' directory in your package
sources, and put the DLL you want to use there. Another approach
(used in a few CRAN packages) is to use 'configure.win' to copy the
DLL to a 'libs' directory in the installed package. A third approach
is to have a 'src/Makefile.win' that creates the DLL you want
(possibly by just checking it is present in 'src', but also possiby by
calling the mysterious Fortran compiler X you obliquely mention
below).
Why I want to do this might explain it a bit further but in fact the
background contains another problem and I welcome anyone to give hints about
that too.
So, we have some Fortran code from way back which deals with fitting taper
curves for tree boles, and some other functions related to that. We wanted to
make these available for use in R and I made a package with simple wrapper
functions for the .Fortran calls, and built it with the help of the compiler
in Rtools. All was fine until my collegue managed to bump in to a combination
of parameters (tree species, height and breast height diameter) with which
the computation freezes. We traced it to a certain very simple iteration in
the Fortran code that finds the height at which the tree has a given
diameter. I could give more details on that, but the point is that the very
same computation goes through just fine when executed "fully" in Fortran,
with the routines and an interface compiled with another Fortran compiler.
And also when that compiler is used to make a DLL and that DLL is used within
the R package in the way I described above.
In summary, what we seem to have here is a compiler dependent convergence
problem. Possible solutions are to figure out what's wrong with the
computation - and I've pretty much exhausted my skills on that - or to figure
out how to use a working DLL, as was my first question.
My concern would be that there are different cases that fail under
Fortran compiler X and you are just sweeping the problem under the
carpet.
Great big thanks in advance to anyone with advice!
Seija Sirkiä,
senior researcher (statistics), Finnish forestry research institute
--
Brian D. Ripley, rip...@stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel