This function attempts to set a default value for a given target object. If the object is NULL, a default value is returned.

When the target object is not NULL, this function will try and coerce it to match the type of the default (given by typeof). This is useful in situations where we are looking to parse the input as well, such at looking at elements of an API call string and wanting to set the character numbers as actual numeric types.

Not all coercions are possible, however, and if the function encounters one of these (ex: setIfNull("foo", 5)) the function will fail.

setIfNull(target, default)

Arguments

target

Object to test if NULL (must be length 1).

default

Object to return if target is NULL (must be length one).

Value

If target is not NULL, then target is coerced to the type of default. Otherwise, default is returned.

Possible Coercions

This function checks the type of the target and default as given by typeof. Specifically, it accounts for the types:

  • character

  • integer

  • double

  • complex

  • logical

  • list

R tries to intelligently coerce types, but some coercions from one type to another won't always be possible. Everything can be turned into a character, but only some character objects can become numeric ("7" can, while "hello" cannot). Some other coercions work, but you will lose information in the process. For example, the double 5.7 can be coerced into an integer, but the decimal portion will be dropped with no rounding. It is important to realize that while it is possible to move between most types, the results are not always meaningful.

Examples

library(MazamaCoreUtils)

setIfNull(NULL, "foo")
#> [1] "foo"
setIfNull(10, 0)
#> [1] 10
setIfNull("15", 0)
#> [1] 15


# This function can be useful for adding elements to a list
testList <- list("a" = 1, "b" = "baz", "c" = "4")

testList$a <- setIfNull(testList$a, 0)
testList$b <- setIfNull(testList$c, 0)
testList$d <- setIfNull(testList$d, 6)


# Be careful about unintended results
setIfNull("T", FALSE) # This returns `TRUE`
#> [1] TRUE
setIfNull(12.8, 5L)   # This returns the integer 12
#> [1] 12


if (FALSE) {
# Not all coercions are possible
setIfNull("bar", 5)
setIfNull("t", FALSE)
}