Skip to content

Commit 645df38

Browse files
authored
Merge pull request #18 from jamesdunham/no-rcpp
remove Rcpp dependency by rewriting dichotomize() in R
2 parents 3de16a8 + a66abd5 commit 645df38

9 files changed

+29
-130
lines changed

DESCRIPTION

-3
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,13 @@ Imports:
2727
lubridate,
2828
methods,
2929
R6,
30-
Rcpp (>= 0.12.10),
3130
survey
3231
Suggests:
3332
knitr,
3433
rmarkdown,
3534
testthat
36-
LinkingTo: Rcpp (>= 0.12.10)
3735
NeedsCompilation: yes
3836
Collate:
39-
'RcppExports.R'
4037
'aggregate_item_responses.r'
4138
'assertions.r'
4239
'class-control.r'

NAMESPACE

-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ exportMethods(show)
2121
exportMethods(summarize)
2222
exportMethods(summary)
2323
import(R6)
24-
import(Rcpp)
2524
import(data.table)
2625
import(dgodata)
2726
import(ggplot2)
@@ -43,4 +42,3 @@ importFrom(stats,weights)
4342
importFrom(utils,capture.output)
4443
importFrom(utils,packageVersion)
4544
importFrom(utils,type.convert)
46-
useDynLib(dgo)

R/RcppExports.R

-7
This file was deleted.

R/dichotomize_item_responses.r

+11-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dichotomize <- function(item_data, ctrl) {
1818

1919
for (k in ctrl@item_names) {
2020
stopifnot(is.numeric(item_data[[k]]))
21-
gt_cols <- dichotomize_cpp(item_data[[k]])
21+
gt_cols <- dichotomize_r(item_data[[k]])
2222
cn <- paste0(k, sub("^X", "", names(gt_cols)))
2323
item_data[, c(cn) := gt_cols]
2424
data.table::setattr(item_data, "gt_items", c(attr(item_data, "gt_items"),
@@ -27,6 +27,16 @@ dichotomize <- function(item_data, ctrl) {
2727
invisible(item_data)
2828
}
2929

30+
dichotomize_r <- function(vec) {
31+
vec <- as.numeric(vec)
32+
uniques <- sort(unique(na.omit(vec)))
33+
ret <- data.table::data.table("X_gt1" = rep(NA, length(vec)))
34+
for (i in seq.int(0, max(0, length(uniques) - 2))) {
35+
ret[, paste0("X_gt", i + 1) := as.integer(vec > uniques[i + 1])]
36+
}
37+
ret[]
38+
}
39+
3040
coerce_item_types <- function(item_data, ctrl) {
3141
# Coerce item response variables to numeric
3242
#

R/package.R

-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#'
88
#' @docType package
99
#' @name dgo
10-
#' @import Rcpp
1110
#' @import data.table
1211
#' @import dgodata
1312
#' @import ggplot2
@@ -16,5 +15,4 @@
1615
#' @importFrom stats as.formula formula model.frame model.matrix na.fail na.omit
1716
#' quantile sd setNames weighted.mean weights
1817
#' @importFrom utils capture.output type.convert packageVersion
19-
#' @useDynLib dgo
2018
NULL

src/RcppExports.cpp

-18
This file was deleted.

src/dgo_init.c

-18
This file was deleted.

src/dichotomize.cpp

-61
This file was deleted.

tests/testthat/test-dichotomize.r

+18-18
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
context("dichotomizing item responses")
22

33
test_that("dichotomizing item responses works", {
4-
expect_equal(dichotomize_cpp(0:1), data.frame(X_gt1 = 0:1))
5-
expect_equal(dichotomize_cpp(NA), data.frame(X_gt1 = as.numeric(NA)))
6-
expect_equal(dichotomize_cpp(c(1:2, NA)), data.frame(X_gt1 = c(0, 1, NA)))
7-
expect_equal(dichotomize_cpp(c(0:1, NA)), data.frame(X_gt1 = c(0, 1, NA)))
8-
expect_equal(dichotomize_cpp(c(0, 2, NA)), data.frame(X_gt1 = c(0, 1, NA)))
9-
expect_equal(dichotomize_cpp(1:3), data.frame(X_gt1 = c(0, 1, 1),
4+
expect_equal(dichotomize_r(0:1), data.table::data.table(X_gt1 = 0:1))
5+
expect_equal(dichotomize_r(NA), data.table::data.table(X_gt1 = as.numeric(NA)))
6+
expect_equal(dichotomize_r(c(1:2, NA)), data.table::data.table(X_gt1 = c(0, 1, NA)))
7+
expect_equal(dichotomize_r(c(0:1, NA)), data.table::data.table(X_gt1 = c(0, 1, NA)))
8+
expect_equal(dichotomize_r(c(0, 2, NA)), data.table::data.table(X_gt1 = c(0, 1, NA)))
9+
expect_equal(dichotomize_r(1:3), data.table::data.table(X_gt1 = c(0, 1, 1),
1010
X_gt2 = c(0, 0, 1)))
11-
expect_equal(dichotomize_cpp(as.factor(0:1)), data.frame(X_gt1 = 0:1))
12-
expect_equal(dichotomize_cpp(as.factor(NA)), data.frame(X_gt1 = as.numeric(NA)))
13-
expect_equal(dichotomize_cpp(as.factor(c(1:2, NA))), data.frame(X_gt1 = c(0, 1, NA)))
14-
expect_equal(dichotomize_cpp(as.factor(c(0:1, NA))),
15-
data.frame(X_gt1 = c(0, 1, NA)))
16-
expect_equal(dichotomize_cpp(as.factor(c(0, 2, NA))),
17-
data.frame(X_gt1 = c(0, 1, NA)))
18-
expect_equal(dichotomize_cpp(as.factor(1:3)), data.frame(X_gt1 = c(0, 1, 1),
11+
expect_equal(dichotomize_r(as.factor(0:1)), data.table::data.table(X_gt1 = 0:1))
12+
expect_equal(dichotomize_r(as.factor(NA)), data.table::data.table(X_gt1 = as.numeric(NA)))
13+
expect_equal(dichotomize_r(as.factor(c(1:2, NA))), data.table::data.table(X_gt1 = c(0, 1, NA)))
14+
expect_equal(dichotomize_r(as.factor(c(0:1, NA))),
15+
data.table::data.table(X_gt1 = c(0, 1, NA)))
16+
expect_equal(dichotomize_r(as.factor(c(0, 2, NA))),
17+
data.table::data.table(X_gt1 = c(0, 1, NA)))
18+
expect_equal(dichotomize_r(as.factor(1:3)), data.table::data.table(X_gt1 = c(0, 1, 1),
1919
X_gt2 = c(0, 0, 1)))
2020

21-
expect_equal(dichotomize_cpp(as.ordered(c("a", "b"))), data.frame(X_gt1 = 0:1))
22-
expect_equal(dichotomize_cpp(ordered(c("a", "b"),levels = c("b", "a"))),
23-
data.frame(X_gt1 = c(1, 0)))
21+
expect_equal(dichotomize_r(as.ordered(c("a", "b"))), data.table::data.table(X_gt1 = 0:1))
22+
expect_equal(dichotomize_r(ordered(c("a", "b"),levels = c("b", "a"))),
23+
data.table::data.table(X_gt1 = c(1, 0)))
2424

25-
expect_error(dichotomize_cpp("a"), "not compatible", ignore.case = TRUE)
25+
expect_warning(dichotomize_r("a"), "NAs introduced by coercion", ignore.case = TRUE)
2626
})

0 commit comments

Comments
 (0)