A COM interface to some S functions
We define the COM server as having 3 methods
that generate samples from different distributions.
The S functions we expose are
rnorm,
rpois
and
rbinom
for the Normal, Poisson and Binomial distributions.
Rather than expose these using the S function names,
we can use more informative names to non-S users
such as "normal", "poisson", and "binomial".
We do this by providing these as the names
of the character vector identifying the functions to expose.
We use the
SCOMNamedFunctionClass
class to define the COM class since
we are exposing top-level function names as COM methods.
We use the name "RNG" to identify the COM class
to clients and register the definition with both
R and the Windows registry.
def = SCOMNamedFunctionClass(functions = c(normal="rnorm", poisson="rpois", binomial="rbinom"),
name = "RNG",
help = "Generate values from probability distributions"
)
registerCOMClass(def)
|
---|
At this point, we are ready to use the class in client applications.
We can easily use this class in a Perl application
by loading the Perl COM module (Win32::OLE)
and using that to create a new "RNG" object.
use Win32::OLE;
$r = Win32::OLE->new("RNG");
|
---|
Now that we have the RNG object, we can
invoke any of the methods.
We first generate a sample of size 10 from a
standard normal
and then another sample but this time specifying
the mean of the distribution as 50.
# 10 values from N(0, 1)
@x = @{$r->normal(10)};
print "Normal: @x\n";
# Now generate 10 values from a N(50, 1)
@x = @{$r->normal(10, 50)};
print "Normal: @x\n";
|
---|
If we wanted to specify just the standard deviation,
we could use named arguments.
We do this in perl by giving all the arguments within
a table/associate array as shown below.
# Now generate 10 values from a N(0, 20)
@x = @{$r->normal(''=> 10, 'sd' => 20)};
print "Normal: @x\n";
|
---|
Note that we can provide arguments by position to the S function
without a name and simply using ''.
However, one should almost never use unnamed arguments after
named arguments.
So
@x = @{$r->normal(''=> 10, 'sd' => 20, 'mean' => 100)};
print "Normal: @x\n";
|
---|
is fine, but
@x = @{$r->normal(''=> 10, 'sd' => 20, '' => 100)};
print "Normal: @x\n";
|
---|
gets very confused and uses 100 as the value for n
Finally, we illustrate the use of the other
two methods for generating a sample
from a Poisson and a Binomial distribution.
@x = @{$r->poisson(5, 3)};
print "Poisson: @x\n";
@x = @{$r->binomial(7, 20, .2)};
print "Binomial: @x\n";
|
---|
The arguments are passed to the corresponding S functions
and one can consult the help for these
to understand their meaning.