/
administered_functions.R
108 lines (95 loc) · 3.2 KB
/
administered_functions.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#' @include module_functions.R
NULL
#' Update a constraints object to exclude administered items
#'
#' The function \code{\link{excludeAdministeredItems}} produces a new \code{\linkS4class{constraints}} object
#' that excludes administered items from being selected.
#'
#' @param constraints a \code{\linkS4class{constraints}} object.
#' @param administered_items item names of previously administered items.
#'
#' @return a \code{\linkS4class{constraints}} object that also constrains the administered items to be excluded.
#'
#' @examples
#' \dontrun{
#' require(TestDesign)
#'
#' cfg <- createShadowTestConfig(
#' MIP = list(solver = "lpsymphony")
#' )
#' constraints <- constraints_reading
#' solution <- Shadow(cfg, constraints, true_theta = 0)
#' administered_items <- solution@output[[1]]@administered_item_index
#' administered_items <- solution@constraints@pool@id[administered_items]
#' administered_items
#'
#' updated_constraints <- excludeAdministeredItems(constraints, administered_items)
#'
#' solution <- Shadow(cfg, updated_constraints, true_theta = 0)
#' administered_items <- solution@output[[1]]@administered_item_index
#' administered_items <- solution@constraints@pool@id[administered_items]
#' administered_items ## entirely different from above
#' }
#' @export
excludeAdministeredItems <- function(constraints, administered_items) {
if (length(administered_items) == 0) {
return(constraints)
}
item_pool <- constraints@pool
item_index <- which(item_pool@id %in% administered_items)
if (length(item_index) != length(administered_items)) {
stop("'administered_items' has item names not present in the pool")
}
tmp <- sprintf('"%s"', administered_items)
tmp <- paste0(tmp, collapse = ", ")
tmp <- sprintf("ID %%in%% c(%s)", tmp)
new_constraint <- data.frame(
CONSTRAINT = dim(constraints@constraints)[1] + 1,
TYPE = "EXCLUDE",
WHAT = "ITEM",
CONDITION = tmp,
LB = NA,
UB = NA,
ONOFF = NA
)
new_constraints <- rbind(constraints@constraints[, 1:7], new_constraint)
new_constraints <- loadConstraints(
new_constraints,
constraints@pool,
constraints@item_attrib,
constraints@st_attrib)
return(new_constraints)
}
#' Remove item data from examinee list
#'
#' \code{\link{removeItemData}} is a function to remove the item data from
#' the \code{\linkS4class{examinee}} objects for the reduction of file size.
#'
#' @param examinee_list a list containing \code{\linkS4class{examinee}} objects.
#'
#' @return a list containing \code{\linkS4class{examinee}} objects,
#' with \code{item_data} data stripped for compact storage.
#'
#' @export
removeItemData <- function(examinee_list) {
examinee_list <-
lapply(
examinee_list,
function(x) {
n_module <- x@n_module
item_data <- vector("list", n_module)
for (module in 1:n_module) {
item_data[[module]] <- list(
NCAT = x@item_data[[module]]@NCAT,
model = x@item_data[[module]]@model,
ipar_1 = x@item_data[[module]]@ipar[, 1],
ipar_2 = x@item_data[[module]]@ipar[, 2]
)
}
x@item_data[1:x@n_module] <- NULL
x@item_data <- item_data
return(x)
}
)
return(examinee_list)
}