# [R] promoting scalar arguments to vectors in a function

Marc Schwartz 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.
>
> Joe

For a general overview of R's recycling approach, see:

https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Vector-arithmetic

and:

https://cran.r-project.org/doc/manuals/r-release/R-intro.html#The-recycling-rule

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.

Regards,

Marc Schwartz

```