# Ensure no duplicate terms appear in `formula`

Source: `R/validation.R`

`validate_no_formula_duplication.Rd`

validate - asserts the following:

`formula`

must not have duplicates terms on the left and right hand side of the formula.

check - returns the following:

`ok`

A logical. Does the check pass?`duplicates`

A character vector. The duplicate terms.

## Usage

```
validate_no_formula_duplication(formula, original = FALSE)
check_no_formula_duplication(formula, original = FALSE)
```

## Arguments

- formula
A formula to check.

- original
A logical. Should the original names be checked, or should the names after processing be used? If

`FALSE`

,`y ~ log(y)`

is allowed because the names are`"y"`

and`"log(y)"`

, if`TRUE`

,`y ~ log(y)`

is not allowed because the original names are both`"y"`

.

## Value

`validate_no_formula_duplication()`

returns `formula`

invisibly.

`check_no_formula_duplication()`

returns a named list of two components,
`ok`

and `duplicates`

.

## Validation

hardhat provides validation functions at two levels.

`check_*()`

:*check a condition, and return a list*. The list always contains at least one element,`ok`

, a logical that specifies if the check passed. Each check also has check specific elements in the returned list that can be used to construct meaningful error messages.`validate_*()`

:*check a condition, and error if it does not pass*. These functions call their corresponding check function, and then provide a default error message. If you, as a developer, want a different error message, then call the`check_*()`

function yourself, and provide your own validation function.

## See also

Other validation functions:
`validate_column_names()`

,
`validate_outcomes_are_binary()`

,
`validate_outcomes_are_factors()`

,
`validate_outcomes_are_numeric()`

,
`validate_outcomes_are_univariate()`

,
`validate_prediction_size()`

,
`validate_predictors_are_numeric()`

## Examples

```
# All good
check_no_formula_duplication(y ~ x)
#> $ok
#> [1] TRUE
#>
#> $duplicates
#> character(0)
#>
# Not good!
check_no_formula_duplication(y ~ y)
#> $ok
#> [1] FALSE
#>
#> $duplicates
#> [1] "y"
#>
# This is generally okay
check_no_formula_duplication(y ~ log(y))
#> $ok
#> [1] TRUE
#>
#> $duplicates
#> character(0)
#>
# But you can be more strict
check_no_formula_duplication(y ~ log(y), original = TRUE)
#> $ok
#> [1] FALSE
#>
#> $duplicates
#> [1] "y"
#>
# This would throw an error
try(validate_no_formula_duplication(log(y) ~ log(y)))
#> Error in validate_no_formula_duplication(log(y) ~ log(y)) :
#> The following terms are duplicated on the left and right hand side of the `formula`: 'log(y)'.
```