The result of evaluating a Wolfram Language function may be the same as the input if the function is called with the wrong types of arguments. You can replicate that behavior in user-defined functions.

Using Argument Patterns...

If you invoke a function with arguments that do not match the argument patterns in its definition, it will return unevaluated.

Define f to take an integer argument:

f evaluates when it is called with an integer:

f returns unevaluated when it is called with a noninteger:

Using Conditional Tests...

If you add a condition to a function definition, the function will return unevaluated if the condition is not satisfied.

Define g to evaluate only if its argument is odd:

g evaluates when it is called with an odd integer:

g returns unevaluated when it is called with an even integer: