evalCall {PBSmodelling} | R Documentation |
Evaluate a Function Call
Description
Evaluates a function call after resolving potential argument conflicts.
Usage
evalCall(fn, argu, ..., envir = parent.frame(),
checkdef=FALSE, checkpar=FALSE)
Arguments
fn |
R function |
argu |
list of explicitly named arguments and their values to pass to |
... |
additional arguments that a user might wish to pass to |
envir |
environment from which the call originates (currently has no use or effect). |
checkdef |
logical: if |
checkpar |
logical: if |
Details
This function builds a call to the specified function and executes it.
During the build, optional arguments (...) are checked for
(i) duplication with explicit arguments argu
: if any are duplicated,
the user-supplied arguments supersede the explicit ones;
(ii) availability as usable arguments in fn
, fn.default
if
checkdef=TRUE
, and par
if checkpar=TRUE
.
Value
Invisibly returns the string expression of the function call that is
passed to eval(parse(text=expr))
.
Note
Sometimes the user may wish to pass arguments into a function to be used
by other functions within, but may not want all the arguments to be used,
depending on the functions subsequently called. In this case, the user needs
to create a list object called dots
, which is passed to evalCall
.
For instance, if the user passes lwd=4
but only wants this
used in a call to lines
but not in a call to points
,
the function might look like this:
myfunc = function(x=seq(0,360,5), ...) { pdots = ldots = list(...) pdots[["lwd"]] = NULL ldots[["col"]] = "cyan" xrad = x*pi/180 plot(sin(xrad),type="n") evalCall(lines, argu=list(x=sin(xrad)), dots=ldots, checkpar=TRUE) evalCall(points,argu=list(x=sin(xrad)), dots=pdots, checkpar=TRUE) } myfunc(lwd=4,pch=20,col=" blue")
Author(s)
Rowan Haigh, Pacific Biological Station, Fisheries and Oceans Canada, Nanaimo BC
See Also
Examples
local(envir=.PBSmodEnv,expr={
oldpar = par(no.readonly=TRUE)
# A user may have a function that calls other functions
# using specific defaults (e.g., blue triangles)
#------------------------------------------------------
pbsfun = function(..., use.evalCall=TRUE) {
plotAsp(0,0,type="n",xlim=c(-1.5,1.5),ylim=c(-1.5,1.5),
axes=FALSE, frame.plot=TRUE, xlab="",ylab="")
if (use.evalCall)
evalCall(polygon, ...,
argu=list(x=c(-1,1,0),y=c(1,1,-1), col="dodgerblue", border="grey"))
else
polygon(x=c(-1,1,0),y=c(1,1,-1),col="dodgerblue",border="grey",...)
}
par(mfrow=c(2,1))
pbsfun(lwd=4,use.evalCall=FALSE)
#------------------------------------------------------
# But what if the user wants pink triangles?
pbsfun(col="pink",lwd=4,use.evalCall=TRUE,checkpar=TRUE)
par(oldpar)
})
# Without 'evalCall' an error occurs due to duplicated arguments
## Not run: pbsfun(col="pink",lwd=4,use.evalCall=FALSE)