> # In R: > f <- function(x, ...) list(...) > f(1,2) [[1]] [1] 2 > f(1,2,) Error in f(1, 2, ) : argument is missing, with no default >
So it seems that quite different methods must be used in S-PLUS and R to detect and process the arguments of a function that can have empty arguments matched to '...'.
In R, the only way I could find to get the non-empty arguments in the presence of empty arguments was to call eval() on particular components of match.call() (as in the function f.R() below). Is there a better way?
I've appended some example functions and test calls in case anyone wants to play with this and suggest possible alternative methods.
-- Tony Plate
# R function to process empty arguments
f.R <- function(x, ...) {
dotargs <- match.call(expand.dots=F)$...
arg.missing <- sapply(dotargs,
function(a) is.name(a) && as.character(a)=="")
args <- vector("list", length(arg.missing))
i <- 3 # check that args are being eval'd in the right env
args[!arg.missing] <- lapply(dotargs[!arg.missing],
eval, sys.parent())
data.frame(missing=arg.missing,
length=if (length(args)) sapply(args, length)
else numeric(0))
}
i <- 1:7
f.R(1,1:2,i)
# Try to confirm that f.R evaluates its argument in the correct environment
(function() {i<-1:2; f.R(1,1:2,i)})()
f.R(1)
f.R(1,,,)
f.R(1,,2:4,)
f.R(1,numeric(0),2:4,)
f.R(1,NULL,2:4,)
f.R(1,NULL,2:4,,,,)# Example of an S-PLUS function that can process empty anonymous arguments
f.S <- function(x, ...) {
dotargs <- match.call(expand.dots=F)$...[-1]
arg.missing <- if (length(dotargs)) sapply(dotargs, mode)=="missing"
else logical(0)
args <- list(...)
args <- args[replace(cumsum(!arg.missing), arg.missing,
length(args)+1)]
data.frame(missing=arg.missing,
length=if (length(args)) sapply(args, length)
else numeric(0))
}
f.S(1)
f.S(1,,,)
f.S(1,,2:4,)
f.S(1,numeric(0),2:4,)
f.S(1,NULL,2:4,)
f.S(1,NULL,2:4,,,,)______________________________________________ [email protected] mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
