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)
Object to test if NULL
(must be length 1).
Object to return if target
is NULL
(must be
length one).
If target
is not NULL
, then target
is coerced to
the type of default
. Otherwise, default
is returned.
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.
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)
}