# Basics ----
test_that("fmls can be initialized and formatted", {
# Empty class
expect_length(fmls(), 0)
})
test_that("fmls-fmls can be combined", {
# Vec ptype2 and cast testing
f1 <- output ~ input + modifier
f2 <- output ~ .x(input) + modifier
f3 <- output ~ .x(input) + log(modifier) + log(variable) + another
# Simple
x <- fmls(f1)
y <- fmls(f2)
expect_s3_class(vec_ptype2(x, y), "fmls")
# Should remove exposure variable from second term
f <- vec_c(x, y)
expect_length(f, 3)
expect_equal(nrow(f), 2)
expect_equal(f[1, ], f[2, ], ignore_attr = TRUE)
expect_false("exposure" %in% vec_data(key_terms(f))$role)
# Flipped version should enrich the exposure term value
f <- vec_c(y, x)
expect_equal(f[1, ], f[2, ], ignore_attr = TRUE)
expect_true("exposure" %in% vec_data(key_terms(f))$role)
expect_length(key_terms(f), 3)
# More complex version
x <- fmls(f1)
y <- fmls(f3)
f <- vec_c(x, y) # "weaker" version is first, richer is second
expect_length(f, 6)
expect_equal(nrow(f), 2)
expect_s3_class(f, "fmls")
expect_false("exposure" %in% vec_data(key_terms(f))$role)
f <- vec_c(y, x) # Flip the order so the richer formula is first
expect_equal(sum(f[1, ], na.rm = TRUE), 5)
expect_equal(sum(f[2, ], na.rm = TRUE), 3)
expect_s3_class(f, "fmls")
expect_true("exposure" %in% vec_data(key_terms(f))$role)
# Print output
expect_output(print(format(x)), "output|input|modifier")
})
test_that("fmls and formulas can be interchanged", {
skip() # not yet implemented, future TODO
})
test_that("tm can convert to fmls objects", {
t <- tm(.o(good) ~ .x(bad) + ugly)
f <- fmls(t)
expect_equal(f, fmls(t))
})
test_that("fmls can be coerced to character class", {
# Characters
x <- fmls(witch ~ wicked + west)
expect_type(vec_c(x, "test"), "character")
})
test_that("patterns can be included into formula", {
f1 <- fmls(witch ~ wicked + west, pattern = "parallel")
expect_equal(nrow(f1), 2)
f2 <- fmls(witch ~ wicked + west + green, pattern = "sequential")
expect_equal(nrow(f2), 3)
f3 <- fmls(witch ~ .x(wicked) + west + green, pattern = "sequential")
expect_equal(nrow(f3), 3)
# Printing for sequential works
x <- mpg ~ wt + hp + cyl + .s(am)
pattern <- "sequential"
f <- fmls(x, pattern = pattern)
expect_equal(nrow(f), 3)
expect_length(f, 4)
})
test_that("interaction terms can be included", {
x <- witch ~ wicked + green + west + wicked:west
expect_equal(as.character(fmls(x)), deparse1(x))
expect_message(f <- fmls(witch ~ .x(wicked) + green + .i(west)))
expect_equal(formula(f, env = .GlobalEnv)[[1]], x, ignore_attr = TRUE)
## By Patterns
# Parallel
# Should produce only one formulas as green and witch:green are needed
# This is a grouping issue from `tm()` function
x <- wicked ~ .x(witch) + .i(green)
f <- fmls(x, pattern = "parallel")
expect_equal(nrow(f), 1)
# Sequential should produce 3 formulas in this case?
x <- wicked ~ .x(witch) + west + .i(green)
f <- fmls(x, pattern = "sequential")
expect_equal(nrow(f), 3)
# Sequential should produce 3 formulas in this case as well
x <- wicked ~ .x(witch) + .i(west) + green
f <- fmls(x, pattern = "sequential")
expect_equal(nrow(f), 3)
f2 <- wicked ~ witch + west + witch:west # Green should not yet have appeared
expect_equal(unname(as.character(f[2, ])), deparse1(f2))
})
test_that("strata terms can be kept within the formula appropriately", {
x <- tm(mpg ~ wt + hp + .s(am))
f <- fmls(x)
expect_length(key_terms(f), 4)
x <- mpg ~ wt + hp + .s(am)
f <- fmls(x)
expect_length(key_terms(f), 4)
expect_equal(ncol(f), 3)
expect_equal(nrow(f), 1)
})
# Special terms ----
test_that("terms with multiple roles can be converted to formulas", {
x <- tm(green + white ~ .x(wicked) + .x(good) + witch + fairy + magic + .m(west))
f <- fmls(x)
expect_equal(nrow(f), 10)
f <- fmls(green ~ .x(wicked) + witch + west, pattern = "sequential")
expect_equal(nrow(f), 3)
f <- fmls(green ~ .x(wicked) + witch + west, pattern = "direct")
expect_equal(nrow(f), 1)
f <-
fmls(witch ~ .x(wicked) + .x(good) + .m(magic) + west + north + green,
pattern = "sequential")
expect_equal(nrow(f), 10)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.