user10430883
user10430883

Reputation:

passing vector to function in R

I'm trying to create a function that subtracts 2 from each element of a vector, and whenever I pass a vector as a parameter to the function, it's outputting an error:

Error in sub(x) : argument "x" is missing, with no default.

so I have a vector that's called x1, and my function call looks like that: sub(x1)

any help will be appreciated.

sub <- function(x)
{
   for(i in 1:length(x))
   {
      x[i] = x[i]-2
   }
   return(x)
}

Upvotes: 3

Views: 15025

Answers (2)

petermeissner
petermeissner

Reputation: 12861

In R a lot of function and operators (just a special form of functions) are vectorised. Vectorisation means that a function/operator works automatically on all elements of an vector (or vector like object).

Therefore, our problem can be solved with much less code. In addition using vectorised functions (especially basic stuff like +, -, ...) is much much much faster than looping over elements.

# define function that does subtraction
sub <- function(x){
  x - 2
} 

# define vector with numbers ranging from 1 to 20
my_vector <- 1:20 

# call function with my_vector as argument
sub(my_vector)

In regard to your error:

Error in sub(x) : argument "x" is missing, with no default.

It is telling you that you called a function sub() without providing an appropriate value for its argument x. Since you did not provide it, and there is no default, and it cannot find it otherwise R does not know what to do and signals (throws) an error.

I can reproduce your error like so:

# call sub without argument
sub()
## Error in sub() : argument "x" is missing, with no default

I can prevent it by providing a value for argument x, like so:

# call sub with value for x 
sub(1)
sub(x = 1)

... Or I can provide defaults like this:

# define function with default values
sub <- function(x = NULL){
  x - 2
}

# call new 'robust' sub() function without arguments
sub()
## numeric(0)

... Or I can provide defaults like this:

# define function with default values
sub <- function(x){
  if ( missing(x) ){
    x <- NULL
  }
  x - 2
}

# call new 'robust' sub() function without arguments
sub()
## numeric(0)

Resources:

Upvotes: 5

jogo
jogo

Reputation: 12559

I suppose you forgot to run your function definition:

sub2 <- function(x)
{
  for(i in 1:length(x))
  {
    x[i] = x[i]-2
  }
  return(x)
}
sub2(1:4) ## works fine

sub(1:4) ## Error calling the function sub(pattern, replacement, x, ...)

Error in sub(1:4) : argument "x" is missing, with no default

or

> x1 <- 1:4
> sub(x1) ## Error
Error in sub(x1) : argument "x" is missing, with no default

If you would have choosen another name for your function (not a name of an existing R-function) the message is clear (to run in a new R-session):

# sub2 <- function(x)
# {
#   for(i in 1:length(x))
#   {
#     x[i] = x[i]-2
#   }
#   return(x)
# }
sub2(1:4)
# > sub2(1:4)
# Error in sub2(1:4) : could not find function "sub2"

I commented out the function definition to simulate not running of the function definition

Upvotes: 1

Related Questions