[R] promoting scalar arguments to vectors in a function
marc_schwartz at me.com
Mon May 23 18:25:26 CEST 2016
On May 23, 2016, at 10:59 AM, JLucke at ria.buffalo.edu wrote:
> R users:
> Suppose I have a function that takes three numeric arguments x, y, and z,
> any of which may be scalars or vectors.
> Suppose further that the user takes one of the arguments, say y, as a
> vector with the other two as scalars.
> Is there an existing R function that will promote the other two arguments
> to vectors of the same size?
> I know in most cases this is not a problem as the promotion is automatic.
> I need this for a function I am writing
> and I don't want to write any additional code to do this if I can help it.
For a general overview of R's recycling approach, see:
The question is what type of error checking you want to embed in your function, if the lengths of each argument are not the same and that would be a problem. Do you want to presume that a user will pass arguments that fit your a priori expectation, or protect against the possibility that they do not?
What would you do if y is a vector of length 6, x is a vector of length 1 and z is a vector of length 8?
R's default rules would replicate 'x' 8 times (e.g. rep(x, 8)), while extending 'y' by 2 (e.g. y <- y[c(1:6, 1:2)]), so that both have length(z).
You can use something along the lines of:
Max.Len <- max(length(x), length(y), length(z))
x <- rep(x, length.out = Max.Len)
y <- rep(y, length.out = Max.Len)
z <- rep(z, length.out = Max.Len)
which will recycle each as may be needed so that they have a common length.
Only you will know, given your function, if that might result in problems in whatever result your function is intended to generate.
More information about the R-help