.Call
interface provides a convenient method for manipulating S-PLUS objects from within C.
.Call(...)
.C
function, including the following:
NAME the name of the C function being called.
... the names of the arguments to the C function.
COPY a logical vector specifying which arguments to protect by copying. If omitted, all arguments are copied before modification.
.Call
are those of the called function.
C functions callable by
.Call
are required to have all
arguments and the return value be objects of C type
s_object *
.
They must also include the standard S-PLUS header file,
S.h
.
Any function dealing with the S-PLUS evaluator must declare the evaluator by use of the
S_EVALUATOR
macro.
J.M. Chambers (1998). Programming with Data. Springer-Verlag, New York.
# /* C code example # Remove leftmost pound sign to create compilable code below # Then compile and attach the associate S-PLUS chapter */ # ##include "S.h" # s_object *makeseq(s_object *sobjX) #{ # S_EVALUATOR # long i, n, xmax, *seq, *x # s_object *sobjSeq # /* Convert the s_objects into C data types: */ # sobjX = AS_INTEGER(sobjX) # x = INTEGER_POINTER(sobjX) # n = GET_LENGTH(sobjX) # /* Compute max value: */ # xmax = x[0] # if(n > 1) { # for(i=1; i<n; i++) { # if(xmax < x[i]) xmax = x[i] # } # } # if(xmax < 0) # PROBLEM "The maximum value (%ld) is # negative.", xmax ERROR # /* Create a new s_object, set its length and get a C integer # pointer to it */ # sobjSeq = NEW_INTEGER(0) # SET_LENGTH(sobjSeq, xmax) # seq = INTEGER_POINTER(sobjSeq) # for(i=0; i<xmax; i++) { # seq[i] = i + 1 # } # return(sobjSeq) #} makeseq <- function(x){ x <- as.integer(x) .Call("makeseq", x) } makeseq(5)