context("Fabricate")
test_that("Fabricate, basic", {
basic <- fabricate(N = 2)
expect_equal(nrow(basic), 2)
expect_identical(basic$ID, c("1", "2"))
})
test_that("Fabricate, creating variables", {
y_fix <- fabricate(N = 2, Y = 10)
expect_true(all(y_fix$Y == 10))
expect_identical(names(y_fix), c("ID", "Y"))
new_label <- fabricate(N = 2, Y = 10, ID_label = "test")
expect_identical(names(new_label), c("test", "Y"))
add_another_var <- fabricate(N = 2, Y1 = 5, Y2 = rnorm(N))
expect_equal(ncol(add_another_var), 3)
})
test_that("Moving data after the splat; implicit options for data/N", {
# Explicit data
expect_equal(nrow(fabricate(data = sleep)), 20)
# Explicit N
expect_equal(nrow(fabricate(N = 20)), 20)
# Explicit add_level call
expect_equal(nrow(fabricate(al = add_level(N = 20))), 20)
# Implicit add_level call
expect_equal(nrow(fabricate(add_level(N = 20, ID_label="al"))), 20)
# Implicit data call
expect_equal(nrow(fabricate(sleep)), 20)
# Implicit N
expect_equal(nrow(fabricate(20)), 20)
# Some named arguments, implicit data
expect_equal(nrow(fabricate(z = rnorm(N), sleep)), 20)
})
test_that("Reassignment", {
expect_equal(max(fabricate(
N = 2, A = 1:2, A = 3
)$A), 3)
})
test_that("Modify single level", {
df <- fabricate(N = 2, Y = 10)
df2 <- fabricate(data = df, Y2 = Y + 1)
expect_identical(df2$Y, c(10, 10))
expect_identical(df2$Y2, c(11, 11))
# TODO: Issue #77 -- # expect_equal(ncol(df2), 4)
})
test_that("Modify single level when import is single column.", {
msl <- fabricate(
data = data.frame(existing_data = rnorm(5)),
Y1 = rnorm(N),
Y2 = rnorm(N)
)
expect_identical(names(msl), c("existing_data", "ID", "Y1", "Y2"))
})
test_that("Modify single level, specify ID to graft.", {
msl_specify <- fabricate(
data = data.frame(existing_data = rnorm(5)),
Y1 = rnorm(N),
Y2 = rnorm(N),
ID_label = "IDtest"
)
expect_identical(names(msl_specify), c("existing_data", "IDtest", "Y1", "Y2"))
})
test_that("fabricate with a level call", {
level_call <- fabricate(l1id = add_level(N = 5, doubler = seq(2, N*2, 2)))
level_call2 <- fabricate(N = 5, doubler = seq(2, N*2, 2), ID_label = "l1id")
expect_identical(level_call, level_call2)
})
test_that("Fabricate with multiple level calls", {
fab_nest <- fabricate(
regions = add_level(N = 5, gdp = rnorm(N)),
cities = add_level(N = sample(1:5), subways = gdp + 10)
)
# Variable creation worked
expect_equal(fab_nest$subways, fab_nest$gdp + 10)
# Stochasticity carried forward
expect_gt(var(table(fab_nest$regions)), 0)
})
test_that("Matrix to DF conversion", {
# User provides matrix, test conversion.
m2df <- fabricate(data = matrix(
rep(c(1, 2, 3), 3),
byrow = TRUE,
ncol = 3,
nrow = 3
))
expect_identical(names(m2df), c("X1", "X2", "X3"))
})
test_that("choose N of a level based on data from higher levels", {
test_higher_n <- fabricate(
regions = add_level(N = 3, gdp = 1:3),
cities = add_level(
N = gdp * 10 + 1,
subways = rnorm(N, mean = 5)
)
)
expect_equal(dim(test_higher_n), c(63, 4))
})
test_that("Import data, single level var modification, with/without ID", {
expect_equal(
ncol(fabricate(datasets::BOD, dd = demand * 2, ID_label = "Time")),
3
)
expect_equal(
ncol(fabricate(datasets::BOD, dd = demand * 2)),
4
)
expect_equal(
ncol(fabricate(datasets::BOD, dd = demand * 2, ID_label = "Jello")),
4
)
})
test_that("trigger errors", {
# User didn't provide a name for a level, and let's make sure that we also
# didn't interpret the unnamed level as any of the special arguments
# contextually
expect_error(fabricate(
data = NULL,
N = NULL,
ID_label = NULL,
countries = add_level(N = 10),
add_level(N = 5, population = rnorm(N))
))
# No N in level call
expect_error(fabricate(
regions = add_level(),
cities = add_level(N = sample(1:5), subways = rnorm(N, mean = 5))
))
# Malformed N in level call
expect_error(fabricate(
regions = add_level(N = c(1, 2)),
cities = add_level(N = sample(1:5), subways = rnorm(N, mean = 5))
))
# Malformed N in nested level call
expect_error(fabricate(
regions = add_level(N = 2),
cities = add_level(N = c(5, 5, 5), subways = rnorm(N, mean = 5))
))
# Character vector N
expect_error(fabricate(
regions = add_level(N = 2),
cities = add_level(N = "N that is a character vector",
subways = rnorm(N, mean = 5))
))
# No N, no data
expect_error(fabricate(test1 = runif(10),
test2 = test1 * 3 * runif(10, 1, 2)))
# Non-integer N:
expect_error(fabricate(N = 3.5, test1 = runif(3)))
# Vector N:
expect_error(fabricate(N = c(3, 4), test1 = runif(3)))
expect_error(fabricate(N = c(3, 4), test1 = runif(3), ID_label = "my_id"))
# Non-numeric N
expect_error(fabricate(N = "hello", test1 = runif(3)))
# Negative N
expect_error(fabricate(N = -1, test1 = runif(10)))
# Scalar as data
expect_error(fabricate(data = c(5)))
# Vector as ID_label
expect_error(fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = c("invalid", "id")))
# Matrix as ID_label
expect_error(fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = matrix(rep(c(1, 2, 3), 3),
byrow = TRUE, ncol = 3, nrow = 3)))
# Numeric as ID_label is an error
expect_error(fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = 7))
# Character as ID_label
fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = "hello")
fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = c("hello"))
# undefined object as ID_label
expect_error(fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = test1))
expect_error(fabricate(N = 10,
test1 = rnorm(10),
test2 = rpois(10, lambda = 2),
ID_label = test3))
# Unusual test with implicit data argument
expect_error(fabricate(N = 10, 1:N))
})
test_that("No name in level", {
# TODO: Test is potentially broken here.
expect_error(fabricate(
add_level(
N = 5,
gdp = rnorm(N)
),
add_level(
N = sample(1:5),
subways = rnorm(N, mean = gdp)
)
))
})
test_that("Add level interpreted as data import to fabricate", {
expect_error(fabricate(add_level(
N = 5,
gdp = rnorm(N)
)))
})
test_that("modify_level call when you probably meant add_level", {
expect_error(fabricate(countries = modify_level(N = 10, new_var = rnorm(N))))
})
test_that("modify_level call where you don't specify which level", {
expect_error(fabricate(
countries = add_level(N = 20),
modify_level(ID_new = as.numeric(ID) * 2)
))
})
test_that("modify_level call where you don't specify which level", {
expect_error(fabricate(a=modify_level(b=1)), "no working data frame to modify")
})
test_that("nest_level call when there was no data to nest", {
# No import data, nest level
expect_error(fabricate(countries = nest_level(N = 10, new_var = rnorm(N))))
# Import data, should be able to nest level
df_gen <- fabricate(datasets::BOD, units = nest_level(N = 2, dd = demand * 2))
expect_identical(df_gen$dd, df_gen$demand * 2)
})
test_that("multiple non-nested data frames, again and again", {
multiple_nnest <- fabricate(
l1 = add_level(N = 100),
l2 = add_level(N = 200, nest = FALSE),
l3 = add_level(N = 100, nest = FALSE),
l4 = add_level(N = 300, nest = FALSE)
)
expect_equal(dim(multiple_nnest), c(300, 1))
})
test_that("ID_label stapling for fabricate calls with no levels", {
# Create an import data frame
df <- fabricate(N = 100, d1 = rnorm(N), ID_label = "hello")
# Import it and verify we don't staple another one if the ID label is
# already there
df2 <- fabricate(df, ID_label = "hello", new_var1 = d1 * 2)
expect_equal(length(colnames(df2)), 3)
# Import it and verify we don't staple another one if AN ID label is
# already there and ID_label is not specified
df3 <- fabricate(df, new_var1 = d1 * 2)
expect_equal(length(colnames(df3)), 3)
# Verify we do staple if ID_label is specified and not there
df4 <- fabricate(df, new_var1 = d1 * 2, ID_label = "newid")
expect_equal(length(colnames(df4)), 4)
# Verify we do not staple if nothing changes
df5 <- fabricate(df)
expect_equal(length(colnames(df5)), 2)
})
test_that("Multivariate", {
skip_if_not_installed("MASS")
set.seed(99999)
df <- fabricate(N=100, Y=MASS::mvrnorm(N, 0:2, Sigma = matrix(1, 3,3)))
expect_named(df, c("ID", "Y.1", "Y.2", "Y.3"))
expect_equal(dim(df), c(100,4))
df <- fabricate(N=100, Y=setNames(data.frame(MASS::mvrnorm(N, 0:2, Sigma = matrix(1, 3,3))), c("A","B","C")))
expect_named(df, c("ID", "Y.A", "Y.B", "Y.C"), info = "names borrowed from data.frame")
expect_equal(dim(df), c(100,4))
expect_error(fabricate(N=10, Y=MASS::mvrnorm(20, 0:2, Sigma = matrix(1, 3,3)) ), "Nested structures must have `N.` rows")
})
test_that("Error on blank argument when no data or N explicitly passed in",{
expect_error(fabricate(,sleep), "blank argument")
})
test_that("malformed call where ID is both only column and nonuniqe",{
df <- fabricate(a=add_level(N=10), a=modify_level(a=as.numeric(a) %/% 2), a=modify_level(b=1))
expect_equal(dim(df), c(10,2))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.