.Fortran
Call a Fortran or C Routine
Description
Returns the values of objects after the call to the Fortran or
C subroutine.
Usage
.Fortran(.NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING)
.C(.NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING)
Arguments
.NAME |
a character string giving the name of a Fortran or C routine to be called
as it is stored in the export table of the dll where the rotuine resides.
Fortran names should be lowercase without underscore, however with .Fortran
Spotfire Enterprise Runtime for R will attempt some extended name matching to account for possible Fortran
compiler name case and underscore mangling.
|
... |
arguments to the subroutine.
There must be exactly as many such arguments as the subroutine
expects. They must agree in storage mode and length with the
arguments to the Fortran or C subroutine as written. See the
Details section below for more information. A mismatch
may lead to undefined behavior. Spotfire Enterprise Runtime for R does not limit the number
of arguments that can be passed to a .C or .Fortran call on most
platforms.
Arguments can have any name except NAOK, DUP,
PACKAGE, or ENCODING which are reserved (see below).
Arguments can be of any class that contains the desired vector,
in particular, they can be matrices or multi-way arrays.
The returned components retain these attributes, although
the C or Fortran subroutine called will be ignorant of them.
|
NAOK |
a logical flag. If FALSE (the default), an error is
generated if any missing values or NaN (Not a Number)
or Inf (Infinite) values are found in any argument before
calling the subroutine. If TRUE, these values are allowed
in the arguments passed to the C or Fortran subroutine.
Use is.nan to distinguish between Not a Number
and standard missing values.
|
DUP |
a logical flag. If TRUE (the default), a copy of each argument's data
vector is made before it is passed to the subroutine, so the subroutine
can modify the contents without modifying the exisitng object data.
If FALSE, the arguments are not copied, thus saving memory, however
care must be exercised when using this setting; as FALSE may potentially
affect other evaluations. An error is generated if this argument is FALSE,
and any data argument is a string vector.
|
PACKAGE |
a character string.
The name of a package which contains the specified C or Fortran routine.
The search for the routine will be limited to the package.
|
ENCODING |
a single character string specifying the encoding of character strings.
The value of this argument is currently ignored. The name is reserved and
may be used in the future. It is provided for compatibility with R.
|
Details
The storage modes correspond to the C types and Fortran types
as follows:
| Storage Modes | | C Types | Fortran Types |
| logical | | int * | logical, |
| character | | char ** | character*(*) |
| integer | | int * | integer |
| single | | float * | real |
| double | | double * | double precision |
| complex | | struct {double re,im;} * | double complex
|
(
double complex is a complex datum composed of double
precision parts and might not be available on some older Fortran
compilers.)
The calling function must coerce the arguments to the required data types,
calling coercion functions such as as.double.
The return value (if any) of a C or Fortran function is not transmitted back to the caller
of .C or .Fortran, so C routines should be of type void, and Fortran routines should be
implemented as subroutines. All returned data must be transmitted back via the argument list.
Value
returns a list of the actual arguments to the C or Fortran routine
with any changes it makes to the data vectors. Normally the subroutine
will overwrite some of the data to return the results if its
computations. The returned components retain the class of the original
argument. For example, a supplied matrix is returned as a matrix
with the same structure, but possibly with modified data values.
The names attribute of the list is the names
of the "..." arguments.
Warning
These functions do not use normal S function argument matching.
The named arguments are listed above for convenience, but these
functions would more appropriately have a signature of
....
The differences from the normal argument matching rules are:
- The first argument must be the name of the Fortran
or C subroutine. If the first argument is named with anything other
than 'name' or a prefix of 'name', an error is
generated.
- The other named arguments in the function signature
(NAOK, and so on) can each appear more than once in the
function call. If one of these arguments is given more than once,
a warning is generated and the last specified value is used.
Limitations
Only the first element of a vector of character strings can be passed to Fortran
subroutines. String argument handling in Fortran is also compiler specific, e.g.
hidden arguments are used for handling string lengths, and passing string arguments
to Fortran routines should be done with care, generally avoiding it where possible.
SDifferences between Spotfire Enterprise Runtime for R and Open-source R
The argument "ENCODING" is reserved and may be used in the future in Spotfire Enterprise Runtime for R.
See Also
Examples
# a function that calls a Fortran subroutine that takes a double
# precision array and its length
function(x) {
z <- .Fortran("mycalc", ans=x, length(x))
return(z$ans)
}