# write your own function

You have already used many functions up to this point. Now it’s time to write your own functions. A function takes an object *x*, or more, specified within the round brackets. What comes after the curly braces is what should happen with this object. Let’s take the well-known function mean as an example. We know that the mean is calculated by summing all elements in a numeric vector and then dividing by the number of elements. So instead of using mean, we can write it as sum(x)/length(x), or, in a function form:

```
function(x){sum(x)/length(x)}
```

To access this function later, you can also save it as an object in your environment:

```
my.mean <- function(x){sum(x)/length(x)}
```

For an initial test, let’s create a vector X (uppercase), then execute our function my.mean, and afterwards, use the standard mean function for comparison:

```
X <- c(50:100)
my.mean(X)
mean(X)
```

You can also create default settings:

```
my.mean <- function(x, na.rm = TRUE){
if(na.rm == TRUE){
sum(x, na.rm = TRUE)/length(x[!is.na(x)])
} else {
if(any(is.na(x) == TRUE)){
cat("Error: you need to change your NA settings!")
}
sum(x)/length(x)
}
}
X[sample(1:50, 4)] <- NA
my.mean(X)
my.mean(X, na.rm = FALSE)
```

In this example, the **na.rm** argument has a default value of **TRUE** by defining it in the round bracket. If you call my.mean without providing a value for **na.rm**, it will use the default value - and calculate the mean after excluding NA-values. If na.rm is not **TRUE**, the second part of the loop will be executed. Let’s have a look at a different example:

```
my_function <- function(x, y = 10) {
result <- x + y
return(result)
}
```

Here, our value x will be increased by 10 as long as y is not defined.

```
my_function(5) # This will result in 15 (5 + 10)
```

However, you can still override the default value by explicitly specifying a value for y when calling the function:

```
my_function(5, 20) # This will result in 25 (5 + 20)
```