dyn.load(x, local = TRUE, now = TRUE, ...)
dyn.unload(x)is.loaded(symbol, PACKAGE = "", type = "")
name
to
the DLL given by this argument (plus the conventional extension,
.so, .sl, .dll, ...). This is intended to
add safety for packages, which can ensure by using this argument
that no other package can override their external symbols. This is
used in the same way as in .C
, .Call
,
.Fortran
and .External
functions.""
, the
default), "Fortran"
, "Call"
or "External"
.dyn.load
is used for its side effect which links
the specified DLL to the executing Rimage. Calls to .C
,
.Call
, .Fortran
and .External
can then be used to
execute compiled C functions or Fortran subroutines contained in the
library. The return value of dyn.load
is an object of class
DLLInfo
. See getLoadedDLLs
for information about
this class. The function dyn.unload
unlinks the DLL. Note that unloading a
DLL and then re-loading a DLL of the same name may or may not work: on
Solaris it uses the first version loaded.
is.loaded
checks if the symbol name is loaded and
searchable and hence available for use as a character string value
for argument .NAME
in .C
or .Fortran
or
.Call
or .External
. It will succeed if any one of the
four calling functions would succeed in using the entry point unless
type
is specified. (See .Fortran
for how Fortran
symbols are mapped.) Note that symbols in base packages are not
searchable, and other packages can be so marked.
dyn.unload
on a DLL loaded by
library.dynam
: use library.dynam.unload
.
This is needed for system housekeeping.dyn.load
loads are called See
Unfortunately a very few platforms (e.g., Compaq Tru64) do not handle
the PACKAGE
argument correctly, and may incorrectly find
symbols linked into R.
The additional arguments to dyn.load
mirror the different
aspects of the mode argument to the dlopen()
routine on POSIX
systems. They are available so that users can exercise greater control
over the loading process for an individual library. In general, the
default values are appropriate and you should override them only if
there is good reason and you understand the implications.
#ifdef unix
The local
argument allows one to control whether the symbols in
the DLL being attached are visible to other DLLs. While maintaining
the symbols in their own namespace is good practice, the ability to
share symbols across related
One should be careful of the potential side-effect of using lazy
loading via the now
argument as FALSE
. If a routine is
called that has a missing symbol, the process will terminate
immediately. The intended use is for library developers to call with
value TRUE
to check that all symbols are actually resolved and
for regular users to call with FALSE
so that missing symbols
can be ignored and the available ones can be called.
The initial motivation for adding these was to avoid such termination
in the _init()
routines of the Java virtual machine library.
However, symbols loaded locally may not be (read probably) available
to other DLLs. Those added to the global table are available to all
other elements of the application and so can be shared across two
different DLLs.
Some (very old) systems do not provide (explicit) support for
local/global and lazy/eager symbol resolution. This can be the source
of subtle bugs. One can arrange to have warning messages emitted when
unsupported options are used. This is done by setting either of the
options verbose
or warn
to be non-zero via the
options
function.
There is a short discussion of these additional arguments with some
example code available at
External code must not change the floating point control word, but
many DLLs do so. Common changes are to set it to use 53 bit
precision instead of R's default 64 bit precision, or to unmask
some exceptions. dyn.load
detects such changes,
and restores R's control word to its default value of hex 8001F.
This may cause the DLL to malfunction; if so, it should be rewritten
to save and restore the control word itself. If warn.FPU
is set to TRUE
using the options
function,
a warning will be printed. (If the warning says
that the control word was changed from some other value than 8001F,
please report the circumstances to the Windows maintainers:
that probably indicates an internal bug.)
#endif
library.dynam
to be used inside a package's
.onLoad
initialization. SHLIB
for how to create suitable DLLs.
## expect all of these to be false in R >= 3.0.0.
is.loaded("supsmu") # Fortran entry point in stats
is.loaded("supsmu", "stats", "Fortran")
is.loaded("PDF", type = "External") # pdf() device in grDevices
Run the code above in your browser using DataLab