On 03/07/2009 4:37 PM, robin cowan wrote:
I am trying to write a dynamic linked library for R, in Pascal.
You need to tell us what Pascal compiler you're using. You may need to
ask your compiler provider how to compile something to interface with R,
or tell us all sorts of details that you may not know. Such as:
- what is "integer"?
- what is "cdecl"?
Those have obvious answers; but it really depends on your compiler
writer to implement them in the obvious way or some other. And then
there's:
- what registers does your compiler preserve across calls?
That's usually much harder to discover, but really crucial for stable
performance of the caller.
Duncan Murdoch
(This
is to speed up the execution of a simulation that I am running in R.)
I know Pascal might not be the perfect language for this (C or Fortran
being more natural), but from what I have read I think it should
work. Though I should point out that I am a neophyte when it comes to
DLLs.
From R I want to hand a function in the library a two-dimensional
matrix, operate on the matrix, and hand back a 2-d matrix.
I have no problem creating the library and loading it using dyn.load()
I have written an R wrapper for the function.
When I do something simple using scalars (integers) everything works
fine, or so it seems at least.
However, when I try to use a vector as an argument to the function,
two things happen:
R becomes very unstable;
the function only operates on the first 3 elements of the vector (say
if the vector has 5 elements).
Anyone have experience with this sort of thing?
Thanks,
Robin Cowan
Sample below:
This one works fine:
library Test1Lib;
type
pA=^integer;
procedure simple(x:pA); cdecl;
var i1,i2:integer;
begin
x^:=x^*2;
end;
exports simple;
begin
end.
This one does not:
library Test2Lib;
type
array1=array[1..5] of integer;
pA=^array1;
procedure simpleArray(x:pA); cdecl;
var i1:integer;
begin
for i1:=1 to 5 do
x^[i1]:=x^[i1]*2;
end;
exports simpleArray;
begin
end.
Here is the wrapper I use:
MySimple <- function(x)
{
ans <- .C("simple",as.integer(x)) # or simpleArray in the second case
ans[[1]]
}
Here is what I get:
> x<-c(1,2,3,4,5)
> MySimple(x)
[1] 2 4 6 4 5
The University of Maastricht has changed its name and mail servers. My
email address is now r.co...@maastrichtuniversity.nl.
[[alternative HTML version deleted]]
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel