Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, Escribà-Montagut X, Wheater S (????).
dsBase: 'DataSHIELD' Server Side Base Functions.
-R package version 6.3.4.
+R package version 6.3.5.9000.
@Manual{,
title = {dsBase: 'DataSHIELD' Server Side Base Functions},
author = {Paul Burton and Rebecca Wilson and Olly Butters and Patricia Ryser-Welch and Alex Westerberg and Leire Abarrategui and Roberto Villegas-Diaz and Demetris Avraam and Yannick Marcon and Tom Bishop and Amadou Gaye and Xavier Escribà-Montagut and Stuart Wheater},
- note = {R package version 6.3.4},
+ note = {R package version 6.3.5.9000},
}
Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion J, Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Schmidt C, Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014).
“DataSHIELD: taking the analysis to the data, not the data to the analysis.”
@@ -168,7 +168,7 @@
This function is a serverside aggregate function that computes the
+missing data pattern using mice::md.pattern and applies disclosure control to
+prevent revealing small cell counts.
+
+
+
+
mdPatternDS(x)
+
+
+
+
Arguments
+
+
+
x
+
a character string specifying the name of a data frame or matrix
+containing the data to analyze for missing patterns.
+
+
+
+
Value
+
A list containing:
+
pattern
+
The missing data pattern matrix with disclosure control applied
+
+
valid
+
Logical indicating if all patterns meet disclosure requirements
+
+
message
+
A message describing the validity status
+
+
+
+
Details
+
This function calls the mice::md.pattern function to generate a matrix
+showing the missing data patterns in the input data. To ensure disclosure control,
+any pattern counts that are below the threshold (nfilter.tab, default=3) are
+suppressed.
+
Suppression Method:
+
When a pattern count is below threshold:
+- Row name is changed to "suppressed(<N>)" where N is the threshold
+- All pattern values in that row are set to NA
+- Summary row is also set to NA (prevents back-calculation)
+
Output Matrix Structure:
+
- Rows represent different missing data patterns (plus a summary row at the bottom)
+- Row names contain pattern counts (or "suppressed(<N>)" for invalid patterns)
+- Columns show 1 if variable is observed, 0 if missing
+- Last column shows total number of missing values per pattern
+- Last row shows total number of missing values per variable
+
Note for Pooling:
+
When this function is called from ds.mdPattern with type='combine', suppressed
+patterns are excluded from pooling to prevent disclosure through subtraction.
+This means pooled counts may underestimate the true total when patterns are
+suppressed in some studies.
+
+
+
Author
+
Xavier Escribà montagut for DataSHIELD Development Team
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
index 04ef332c..0d5e1008 100644
--- a/docs/sitemap.xml
+++ b/docs/sitemap.xml
@@ -89,6 +89,7 @@
/reference/matrixInvertDS.html/reference/matrixMultDS.html/reference/matrixTransposeDS.html
+/reference/mdPatternDS.html/reference/meanDS.html/reference/meanSdGpDS.html/reference/mergeDS.html
From 81f5f64c69a99ef88f7e5bf25a3ca92f9e5a536d Mon Sep 17 00:00:00 2001
From: Roberto Villegas-Diaz
Date: Wed, 26 Nov 2025 18:40:32 +0000
Subject: [PATCH 10/58] Remove nightly scheduled run and update call to
parse_test_report.R
---
.github/workflows/dsBase_test_suite.yaml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml
index 8f03b10f..2cbe5ff3 100755
--- a/.github/workflows/dsBase_test_suite.yaml
+++ b/.github/workflows/dsBase_test_suite.yaml
@@ -15,7 +15,6 @@ on:
push:
schedule:
- cron: '0 0 * * 0' # Weekly
- - cron: '0 1 * * *' # Nightly
jobs:
dsBase_test_suite:
@@ -157,8 +156,11 @@ jobs:
- name: Parse results from testthat and covr
run: |
- Rscript --verbose --vanilla ../testStatus/source/parse_test_report.R logs/
+ Rscript --verbose --vanilla ../testStatus/source/parse_test_report.R logs/ logs/ https://github.com/datashield/${{ env.PROJECT_NAME }}/blob/${{ env.BRANCH_NAME }} '[^-:.]+' '(?<=::)[^:]+(?=::)'
working-directory: dsBase
+ env:
+ PROJECT_NAME: ${{ env.PROJECT_NAME }}
+ BRANCH_NAME: ${{ env.BRANCH_NAME }}
- name: Render report
run: |
From e0d234fe71bb61894984e6abf142ebe7e41a3151 Mon Sep 17 00:00:00 2001
From: Roberto Villegas-Diaz
Date: Wed, 26 Nov 2025 19:05:10 +0000
Subject: [PATCH 11/58] Add session_info_*.txt as one of the log outputs and
avoid storing duplicated HTML reports
---
.github/workflows/dsBase_test_suite.yaml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml
index 2cbe5ff3..bea80e31 100755
--- a/.github/workflows/dsBase_test_suite.yaml
+++ b/.github/workflows/dsBase_test_suite.yaml
@@ -152,6 +152,7 @@ jobs:
echo "branch:${{ env.BRANCH_NAME }}" > ${{ env.WORKFLOW_ID }}.txt
echo "os:$(lsb_release -ds)" >> ${{ env.WORKFLOW_ID }}.txt
echo "R:$(R --version | head -n1)" >> ${{ env.WORKFLOW_ID }}.txt
+ Rscript --vanilla -e 'sessionInfo()' >> session_info_${{ env.WORKFLOW_ID }}.txt
working-directory: dsBase/logs
- name: Parse results from testthat and covr
@@ -167,7 +168,6 @@ jobs:
cd testStatus
mkdir -p new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/
- mkdir -p new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/
mkdir -p new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/
# Copy logs to new logs directory location
@@ -175,8 +175,7 @@ jobs:
cp -rv ../${{ env.PROJECT_NAME }}/logs/${{ env.WORKFLOW_ID }}.txt new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/
R -e 'input_dir <- file.path("../new/logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir))'
- mv source/test_report.html new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html
- cp -r new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest
+ mv source/test_report.html new/docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/index.html
env:
PROJECT_NAME: ${{ env.PROJECT_NAME }}
From 42efdb6f852356525667798af41d3ab90ae61b87 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Sun, 30 Nov 2025 14:53:56 +0000
Subject: [PATCH 12/58] Update 'perf' support
---
tests/testthat/perf_tests/perf_rate.R | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/tests/testthat/perf_tests/perf_rate.R b/tests/testthat/perf_tests/perf_rate.R
index 1884cda8..64b638db 100644
--- a/tests/testthat/perf_tests/perf_rate.R
+++ b/tests/testthat/perf_tests/perf_rate.R
@@ -1,5 +1,5 @@
#-------------------------------------------------------------------------------
-# Copyright (c) 2024 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
+# Copyright (c) 2024-2025 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
#
# This program and the accompanying materials
# are made available under the terms of the GNU Public License v3.0.
@@ -8,7 +8,8 @@
# along with this program. If not, see .
#-------------------------------------------------------------------------------
-.perf.reference.filename <- 'perf_files/default_perf_profile.csv'
+.perf.reference.filename <- 'perf_files/default_perf_profile.csv'
+.perf.reference.save.filename <- NULL
.perf.reference <- NULL
@@ -22,7 +23,13 @@ perf.reference.save <- function(perf.ref.name, rate, tolerance.lower, tolerance.
.perf.reference[nrow(.perf.reference)+1,] <- c(perf.ref.name, rate, tolerance.lower, tolerance.upper)
- write.csv(.perf.reference, .perf.reference.filename, row.names = FALSE)
+ if (is.null(.perf.reference.save.filename))
+ {
+ .perf.reference.save.filename <<- base::tempfile(pattern = "perf_file_", fileext = ".csv")
+ message(paste0("Additional perf record added to '", .perf.reference.save.filename, "'"))
+ }
+
+ write.csv(.perf.reference, .perf.reference.save.filename, row.names = FALSE)
.perf.reference <<- .perf.reference
}
@@ -47,4 +54,3 @@ perf.reference.tolerance.upper <- function(perf.ref.name) {
return(as.numeric(.perf.reference[which(.perf.reference$refer_name == perf.ref.name),]$upper_tolerance))
}
-
From 998482cac34d0d4af778c4d320d5244ca9cc58a8 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Sun, 30 Nov 2025 17:15:04 +0000
Subject: [PATCH 13/58] Minor docs update
---
docs/pkgdown.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml
index ad3a64a8..c3eb19af 100644
--- a/docs/pkgdown.yml
+++ b/docs/pkgdown.yml
@@ -2,4 +2,4 @@ pandoc: 3.1.3
pkgdown: 2.2.0
pkgdown_sha: ~
articles: {}
-last_built: 2025-11-21T13:10Z
+last_built: 2025-11-30T16:44Z
From bcfb6ae6892151ee42aaa8d8446ec6185715691e Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Tue, 6 Jan 2026 13:17:49 +0000
Subject: [PATCH 14/58] Reworking of performance profiles
---
azure-pipelines.yml | 1 +
...ne.csv => azure-pipeline_perf-profile.csv} | 0
...circleci.csv => circleci_perf-profile.csv} | 0
..._check.cvs => cran-check_perf-profile.cvs} | 0
...f_profile.csv => default_perf-profile.csv} | 0
...ay.csv => hp-laptop-quay_perf-profile.csv} | 0
tests/testthat/perf_tests/perf_rate.R | 19 +++++++++++++++----
7 files changed, 16 insertions(+), 4 deletions(-)
rename tests/testthat/perf_files/{azure-pipeline.csv => azure-pipeline_perf-profile.csv} (100%)
rename tests/testthat/perf_files/{circleci.csv => circleci_perf-profile.csv} (100%)
rename tests/testthat/perf_files/{cran_check.cvs => cran-check_perf-profile.cvs} (100%)
rename tests/testthat/perf_files/{default_perf_profile.csv => default_perf-profile.csv} (100%)
rename tests/testthat/perf_files/{hp-laptop_quay.csv => hp-laptop-quay_perf-profile.csv} (100%)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index abbcc444..2d3bc950 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -188,6 +188,7 @@ jobs:
# testthat::testpackage uses a MultiReporter, comprised of a ProgressReporter and JunitReporter
# R output and messages are redirected by sink() to test_console_output.txt
# junit reporter output is to test_results.xml
+ export PERF_PROFILE="azure-pipeline"
sudo R -q -e '
library(covr);
write.csv(
diff --git a/tests/testthat/perf_files/azure-pipeline.csv b/tests/testthat/perf_files/azure-pipeline_perf-profile.csv
similarity index 100%
rename from tests/testthat/perf_files/azure-pipeline.csv
rename to tests/testthat/perf_files/azure-pipeline_perf-profile.csv
diff --git a/tests/testthat/perf_files/circleci.csv b/tests/testthat/perf_files/circleci_perf-profile.csv
similarity index 100%
rename from tests/testthat/perf_files/circleci.csv
rename to tests/testthat/perf_files/circleci_perf-profile.csv
diff --git a/tests/testthat/perf_files/cran_check.cvs b/tests/testthat/perf_files/cran-check_perf-profile.cvs
similarity index 100%
rename from tests/testthat/perf_files/cran_check.cvs
rename to tests/testthat/perf_files/cran-check_perf-profile.cvs
diff --git a/tests/testthat/perf_files/default_perf_profile.csv b/tests/testthat/perf_files/default_perf-profile.csv
similarity index 100%
rename from tests/testthat/perf_files/default_perf_profile.csv
rename to tests/testthat/perf_files/default_perf-profile.csv
diff --git a/tests/testthat/perf_files/hp-laptop_quay.csv b/tests/testthat/perf_files/hp-laptop-quay_perf-profile.csv
similarity index 100%
rename from tests/testthat/perf_files/hp-laptop_quay.csv
rename to tests/testthat/perf_files/hp-laptop-quay_perf-profile.csv
diff --git a/tests/testthat/perf_tests/perf_rate.R b/tests/testthat/perf_tests/perf_rate.R
index 64b638db..8de658c3 100644
--- a/tests/testthat/perf_tests/perf_rate.R
+++ b/tests/testthat/perf_tests/perf_rate.R
@@ -1,5 +1,5 @@
#-------------------------------------------------------------------------------
-# Copyright (c) 2024-2025 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
+# Copyright (c) 2024-2026 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
#
# This program and the accompanying materials
# are made available under the terms of the GNU Public License v3.0.
@@ -8,13 +8,24 @@
# along with this program. If not, see .
#-------------------------------------------------------------------------------
-.perf.reference.filename <- 'perf_files/default_perf_profile.csv'
-.perf.reference.save.filename <- NULL
+.perf.reference.filename.base.prefix <- 'perf_files/'
+.perf.reference.filename.base.postfix <- '_perf-profile.csv'
+.perf.reference.save.filename <- NULL
.perf.reference <- NULL
.load.pref <- function() {
- .perf.reference <<- read.csv(.perf.reference.filename, header = TRUE, sep = ",")
+ perf.profile = base::Sys.getenv("PERF_PROFILE")
+ if (nchar(perf.profile) > 0)
+ perf.reference.filename.platform.infix <- base::tolower(perf.profile)
+ else
+ {
+ perf.reference.filename.platform.infix <- "default"
+ warning("Unknown performance profile platform, using 'default'")
+ }
+
+ perf.reference.filename <- paste(.perf.reference.filename.base.prefix, perf.reference.filename.platform.infix, .perf.reference.filename.base.postfix, sep = "")
+ .perf.reference <<- read.csv(perf.reference.filename, header = TRUE, sep = ",")
}
perf.reference.save <- function(perf.ref.name, rate, tolerance.lower, tolerance.upper) {
From 2b201d6930e56433b0149712297cfd6ceec0e74f Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Tue, 6 Jan 2026 14:14:46 +0000
Subject: [PATCH 15/58] Rework setting of variable
---
azure-pipelines.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 2d3bc950..79a26fbe 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -27,6 +27,7 @@ variables:
branchName: $(Build.SourceBranchName)
test_filter: '*'
_r_check_system_clock_: 0
+ PERF_PROFILE: 'azure-pipeline'
@@ -188,7 +189,7 @@ jobs:
# testthat::testpackage uses a MultiReporter, comprised of a ProgressReporter and JunitReporter
# R output and messages are redirected by sink() to test_console_output.txt
# junit reporter output is to test_results.xml
- export PERF_PROFILE="azure-pipeline"
+
sudo R -q -e '
library(covr);
write.csv(
From 9e3892d9ad22484bcc3f275bd88314c935df675a Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Wed, 7 Jan 2026 09:46:47 +0000
Subject: [PATCH 16/58] Fixed Type
---
tests/testthat/perf_tests/perf_rate.R | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/testthat/perf_tests/perf_rate.R b/tests/testthat/perf_tests/perf_rate.R
index 8de658c3..90905e12 100644
--- a/tests/testthat/perf_tests/perf_rate.R
+++ b/tests/testthat/perf_tests/perf_rate.R
@@ -15,7 +15,7 @@
.perf.reference <- NULL
.load.pref <- function() {
- perf.profile = base::Sys.getenv("PERF_PROFILE")
+ perf.profile <- base::Sys.getenv("PERF_PROFILE")
if (nchar(perf.profile) > 0)
perf.reference.filename.platform.infix <- base::tolower(perf.profile)
else
From 56ee2f15aaee7a230ba23d6aeb146b166b183dc3 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Thu, 5 Feb 2026 16:56:31 +0000
Subject: [PATCH 17/58] Update test schedual
---
azure-pipelines.yml | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 79a26fbe..4a207074 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -47,17 +47,18 @@ resources:
# When and under what condition to run the pipeline.
schedules:
- cron: "0 0 * * 0"
- displayName: Weekly build - master
+ displayName: Weekly build - latest release
branches:
include:
- - master
- - 6.3.0
+ - 6.3.4
always: true
- cron: "0 1 * * *"
- displayName: Nightly build - v6.3.1-dev
+ displayName: Nightly build - development branchs
branches:
include:
- - v6.3.1-dev
+ - v6.3.5-dev
+ - v6.4.0-dev
+ - v7.0.0-dev
always: true
jobs:
From 8c8378295d231452a974acd75ee3a9eaa648837d Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Fri, 20 Feb 2026 11:00:52 +0000
Subject: [PATCH 18/58] Update version
---
DESCRIPTION | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index bc5e3973..fabf52d8 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -5,7 +5,7 @@ Description: Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a
been designed to only share non disclosive summary statistics, with built in automated output
checking based on statistical disclosure control. With data sites setting the threshold values for
the automated output checks. For more details, see 'citation("dsBase")'.
-Version: 6.3.5.9000
+Version: 6.3.5
Authors@R: c(person(given = "Paul",
family = "Burton",
role = c("aut"),
From 69d4bb426b9e2e84fff7d2f761aa7aba92a6290a Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Fri, 20 Feb 2026 11:01:28 +0000
Subject: [PATCH 19/58] Update to glmSLMADS.assign
---
R/glmSLMADS.assign.R | 41 +++++++++++++----------------------------
1 file changed, 13 insertions(+), 28 deletions(-)
diff --git a/R/glmSLMADS.assign.R b/R/glmSLMADS.assign.R
index 275e1f47..68fe6929 100644
--- a/R/glmSLMADS.assign.R
+++ b/R/glmSLMADS.assign.R
@@ -18,40 +18,25 @@
#' @export
glmSLMADS.assign <- function(formula, family, offsetName, weightsName, dataName){
-#############################################################
-#MODULE 1: CAPTURE THE nfilter SETTINGS #
-thr <- dsBase::listDisclosureSettingsDS() #
-nfilter.tab <- as.numeric(thr$nfilter.tab) #
-nfilter.glm <- as.numeric(thr$nfilter.glm) #
-#nfilter.subset<-as.numeric(thr$nfilter.subset) #
-#nfilter.string<-as.numeric(thr$nfilter.string) #
-#############################################################
+ # Convert transmitable text for special link variance combinations back to full representation
+ if(family=="quasigamma.link_log")
+ {family<-"quasi(link=log,variance=mu^2)"}
-########################################
-############
-#Convert transmitable text for special link variance combinations back to full representation
-if(family=="quasigamma.link_log")
-{family<-"quasi(link=log,variance=mu^2)"}
+ if(family=="Gamma.link_log")
+ {family<-"Gamma(link=log)"}
-if(family=="Gamma.link_log")
-{family<-"Gamma(link=log)"}
-#############
+ # Correctly name offset, weights and data objects in function call
+ # (to allow glmPredict to work correctly later)
+ calltext <- paste0("mg<-glm(formula,family=",family,",offset=",
+ offsetName,",weights=",weightsName,",data=", dataName,",x=TRUE)")
-#Activate family object (this may not be necessary as character string may already be OK
-#but just checking
-final.family.object<-eval(parse(text=family))
+ eval(parse(text=calltext))
+ # update the call object to include the actual formula
+ mg$call$formula <- formula
-#Correctly name offset, weights and data objects in function call
-#(to allow glmPredict to work correctly later)
-calltext<-paste0("mg<-glm(formula,family=",family,",offset=",
- offsetName,",weights=",weightsName,",data=", dataName,",x=TRUE)")
-
-eval(parse(text=calltext))
-
-return(mg)
+ return(mg)
}
-
# ASSIGN FUNCTION
# glmSLMADS.assign
From 2a4a3496f810b7ad4cfeaf5390afda6f45439631 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Fri, 20 Feb 2026 11:02:18 +0000
Subject: [PATCH 20/58] Update to documents
---
docs/404.html | 2 +-
docs/LICENSE.html | 2 +-
docs/authors.html | 6 +++---
docs/index.html | 2 +-
docs/pkgdown.yml | 2 +-
docs/reference/BooleDS.html | 2 +-
docs/reference/absDS.html | 2 +-
docs/reference/asCharacterDS.html | 2 +-
docs/reference/asDataMatrixDS.html | 2 +-
docs/reference/asFactorDS1.html | 2 +-
docs/reference/asFactorDS2.html | 2 +-
docs/reference/asFactorSimpleDS.html | 2 +-
docs/reference/asIntegerDS.html | 2 +-
docs/reference/asListDS.html | 2 +-
docs/reference/asLogicalDS.html | 2 +-
docs/reference/asMatrixDS.html | 2 +-
docs/reference/asNumericDS.html | 2 +-
docs/reference/aucDS.html | 2 +-
docs/reference/blackBoxDS.html | 2 +-
docs/reference/blackBoxRanksDS.html | 2 +-
docs/reference/boxPlotGGDS.html | 2 +-
docs/reference/boxPlotGG_data_TreatmentDS.html | 2 +-
docs/reference/boxPlotGG_data_Treatment_numericDS.html | 2 +-
docs/reference/bp_standardsDS.html | 2 +-
docs/reference/cDS.html | 2 +-
docs/reference/cbindDS.html | 2 +-
docs/reference/changeRefGroupDS.html | 2 +-
docs/reference/checkNegValueDS.html | 2 +-
docs/reference/checkPermissivePrivacyControlLevel.html | 2 +-
docs/reference/classDS.html | 2 +-
docs/reference/colnamesDS.html | 2 +-
docs/reference/completeCasesDS.html | 2 +-
docs/reference/corDS.html | 2 +-
docs/reference/corTestDS.html | 2 +-
docs/reference/covDS.html | 2 +-
docs/reference/dataFrameDS.html | 2 +-
docs/reference/dataFrameFillDS.html | 2 +-
docs/reference/dataFrameSortDS.html | 2 +-
docs/reference/dataFrameSubsetDS1.html | 2 +-
docs/reference/dataFrameSubsetDS2.html | 2 +-
docs/reference/densityGridDS.html | 2 +-
docs/reference/dimDS.html | 2 +-
docs/reference/dmtC2SDS.html | 2 +-
docs/reference/dsBase-package.html | 2 +-
docs/reference/elsplineDS.html | 2 +-
docs/reference/extractQuantilesDS1.html | 2 +-
docs/reference/extractQuantilesDS2.html | 2 +-
docs/reference/gamlssDS.html | 2 +-
docs/reference/getWGSRDS.html | 2 +-
docs/reference/glmDS1.html | 2 +-
docs/reference/glmDS2.html | 2 +-
docs/reference/glmPredictDS.ag.html | 2 +-
docs/reference/glmPredictDS.as.html | 2 +-
docs/reference/glmSLMADS.assign.html | 2 +-
docs/reference/glmSLMADS1.html | 2 +-
docs/reference/glmSLMADS2.html | 2 +-
docs/reference/glmSummaryDS.ag.html | 2 +-
docs/reference/glmSummaryDS.as.html | 2 +-
docs/reference/glmerSLMADS.assign.html | 2 +-
docs/reference/glmerSLMADS2.html | 2 +-
docs/reference/heatmapPlotDS.html | 2 +-
docs/reference/hetcorDS.html | 2 +-
docs/reference/histogramDS1.html | 2 +-
docs/reference/histogramDS2.html | 2 +-
docs/reference/igb_standardsDS.html | 2 +-
docs/reference/index.html | 2 +-
docs/reference/isNaDS.html | 2 +-
docs/reference/isValidDS.html | 2 +-
docs/reference/kurtosisDS1.html | 2 +-
docs/reference/kurtosisDS2.html | 2 +-
docs/reference/lengthDS.html | 2 +-
docs/reference/levelsDS.html | 2 +-
docs/reference/lexisDS1.html | 2 +-
docs/reference/lexisDS2.html | 2 +-
docs/reference/lexisDS3.html | 2 +-
docs/reference/listDS.html | 2 +-
docs/reference/listDisclosureSettingsDS.html | 2 +-
docs/reference/lmerSLMADS.assign.html | 2 +-
docs/reference/lmerSLMADS2.html | 2 +-
docs/reference/lsDS.html | 2 +-
docs/reference/lsplineDS.html | 2 +-
docs/reference/matrixDS.html | 2 +-
docs/reference/matrixDetDS1.html | 2 +-
docs/reference/matrixDetDS2.html | 2 +-
docs/reference/matrixDiagDS.html | 2 +-
docs/reference/matrixDimnamesDS.html | 2 +-
docs/reference/matrixInvertDS.html | 2 +-
docs/reference/matrixMultDS.html | 2 +-
docs/reference/matrixTransposeDS.html | 2 +-
docs/reference/mdPatternDS.html | 2 +-
docs/reference/meanDS.html | 2 +-
docs/reference/meanSdGpDS.html | 2 +-
docs/reference/mergeDS.html | 2 +-
docs/reference/messageDS.html | 2 +-
docs/reference/metadataDS.html | 2 +-
docs/reference/miceDS.html | 2 +-
docs/reference/minMaxRandDS.html | 2 +-
docs/reference/namesDS.html | 2 +-
docs/reference/nsDS.html | 2 +-
docs/reference/numNaDS.html | 2 +-
docs/reference/qlsplineDS.html | 2 +-
docs/reference/quantileMeanDS.html | 2 +-
docs/reference/rBinomDS.html | 2 +-
docs/reference/rNormDS.html | 2 +-
docs/reference/rPoisDS.html | 2 +-
docs/reference/rUnifDS.html | 2 +-
docs/reference/rangeDS.html | 2 +-
docs/reference/ranksSecureDS1.html | 2 +-
docs/reference/ranksSecureDS2.html | 2 +-
docs/reference/ranksSecureDS3.html | 2 +-
docs/reference/ranksSecureDS4.html | 2 +-
docs/reference/ranksSecureDS5.html | 2 +-
docs/reference/rbindDS.html | 2 +-
docs/reference/reShapeDS.html | 2 +-
docs/reference/recodeLevelsDS.html | 2 +-
docs/reference/recodeValuesDS.html | 2 +-
docs/reference/repDS.html | 2 +-
docs/reference/replaceNaDS.html | 2 +-
docs/reference/rmDS.html | 2 +-
docs/reference/rowColCalcDS.html | 2 +-
docs/reference/sampleDS.html | 2 +-
docs/reference/scatterPlotDS.html | 2 +-
docs/reference/seqDS.html | 2 +-
docs/reference/setSeedDS.html | 2 +-
docs/reference/skewnessDS1.html | 2 +-
docs/reference/skewnessDS2.html | 2 +-
docs/reference/sqrtDS.html | 2 +-
docs/reference/subsetByClassDS.html | 2 +-
docs/reference/subsetDS.html | 2 +-
docs/reference/table1DDS.html | 2 +-
docs/reference/table2DDS.html | 2 +-
docs/reference/tableDS.assign.html | 2 +-
docs/reference/tableDS.html | 2 +-
docs/reference/tableDS2.html | 2 +-
docs/reference/tapplyDS.assign.html | 2 +-
docs/reference/tapplyDS.html | 2 +-
docs/reference/testObjExistsDS.html | 2 +-
docs/reference/unListDS.html | 2 +-
docs/reference/uniqueDS.html | 2 +-
docs/reference/varDS.html | 2 +-
docs/reference/vectorDS.html | 2 +-
141 files changed, 143 insertions(+), 143 deletions(-)
diff --git a/docs/404.html b/docs/404.html
index 828175ea..91a82d08 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -32,7 +32,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/LICENSE.html b/docs/LICENSE.html
index 5faa2d0e..7fde2a96 100644
--- a/docs/LICENSE.html
+++ b/docs/LICENSE.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/authors.html b/docs/authors.html
index a1aec549..47c4a8d1 100644
--- a/docs/authors.html
+++ b/docs/authors.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
@@ -102,12 +102,12 @@
Citation
Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, Escribà-Montagut X, Wheater S (????).
dsBase: 'DataSHIELD' Server Side Base Functions.
-R package version 6.3.5.9000.
+R package version 6.3.5.
@Manual{,
title = {dsBase: 'DataSHIELD' Server Side Base Functions},
author = {Paul Burton and Rebecca Wilson and Olly Butters and Patricia Ryser-Welch and Alex Westerberg and Leire Abarrategui and Roberto Villegas-Diaz and Demetris Avraam and Yannick Marcon and Tom Bishop and Amadou Gaye and Xavier Escribà-Montagut and Stuart Wheater},
- note = {R package version 6.3.5.9000},
+ note = {R package version 6.3.5},
}
Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion J, Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Schmidt C, Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014).
“DataSHIELD: taking the analysis to the data, not the data to the analysis.”
diff --git a/docs/index.html b/docs/index.html
index 1f70741d..9ae6f613 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -33,7 +33,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml
index c3eb19af..9cfbee88 100644
--- a/docs/pkgdown.yml
+++ b/docs/pkgdown.yml
@@ -2,4 +2,4 @@ pandoc: 3.1.3
pkgdown: 2.2.0
pkgdown_sha: ~
articles: {}
-last_built: 2025-11-30T16:44Z
+last_built: 2026-02-20T10:54Z
diff --git a/docs/reference/BooleDS.html b/docs/reference/BooleDS.html
index 7cecbed2..b6c3e109 100644
--- a/docs/reference/BooleDS.html
+++ b/docs/reference/BooleDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/absDS.html b/docs/reference/absDS.html
index ca83bf9d..2c9094a2 100644
--- a/docs/reference/absDS.html
+++ b/docs/reference/absDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asCharacterDS.html b/docs/reference/asCharacterDS.html
index 8f461038..066e14ec 100644
--- a/docs/reference/asCharacterDS.html
+++ b/docs/reference/asCharacterDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asDataMatrixDS.html b/docs/reference/asDataMatrixDS.html
index 2b8fb1d3..17007438 100644
--- a/docs/reference/asDataMatrixDS.html
+++ b/docs/reference/asDataMatrixDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asFactorDS1.html b/docs/reference/asFactorDS1.html
index a5463d70..ab9f62c7 100644
--- a/docs/reference/asFactorDS1.html
+++ b/docs/reference/asFactorDS1.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asFactorDS2.html b/docs/reference/asFactorDS2.html
index 7e1711d3..009d6ff3 100644
--- a/docs/reference/asFactorDS2.html
+++ b/docs/reference/asFactorDS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asFactorSimpleDS.html b/docs/reference/asFactorSimpleDS.html
index 971a9169..ba2b1e93 100644
--- a/docs/reference/asFactorSimpleDS.html
+++ b/docs/reference/asFactorSimpleDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asIntegerDS.html b/docs/reference/asIntegerDS.html
index 0de6c670..dd246175 100644
--- a/docs/reference/asIntegerDS.html
+++ b/docs/reference/asIntegerDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asListDS.html b/docs/reference/asListDS.html
index ab9910cc..834ff96d 100644
--- a/docs/reference/asListDS.html
+++ b/docs/reference/asListDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asLogicalDS.html b/docs/reference/asLogicalDS.html
index 689e2461..e6255513 100644
--- a/docs/reference/asLogicalDS.html
+++ b/docs/reference/asLogicalDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asMatrixDS.html b/docs/reference/asMatrixDS.html
index a85c0c7c..06eb9e9f 100644
--- a/docs/reference/asMatrixDS.html
+++ b/docs/reference/asMatrixDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/asNumericDS.html b/docs/reference/asNumericDS.html
index da79a362..2c014e7c 100644
--- a/docs/reference/asNumericDS.html
+++ b/docs/reference/asNumericDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/aucDS.html b/docs/reference/aucDS.html
index 4800d9d1..a5cb55e8 100644
--- a/docs/reference/aucDS.html
+++ b/docs/reference/aucDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/blackBoxDS.html b/docs/reference/blackBoxDS.html
index 5d02e3a9..88d9dd8e 100644
--- a/docs/reference/blackBoxDS.html
+++ b/docs/reference/blackBoxDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/blackBoxRanksDS.html b/docs/reference/blackBoxRanksDS.html
index 458737b0..79d6e36e 100644
--- a/docs/reference/blackBoxRanksDS.html
+++ b/docs/reference/blackBoxRanksDS.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/boxPlotGGDS.html b/docs/reference/boxPlotGGDS.html
index a0177c41..d4d1e5b2 100644
--- a/docs/reference/boxPlotGGDS.html
+++ b/docs/reference/boxPlotGGDS.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/boxPlotGG_data_TreatmentDS.html b/docs/reference/boxPlotGG_data_TreatmentDS.html
index 7acead1e..7810441d 100644
--- a/docs/reference/boxPlotGG_data_TreatmentDS.html
+++ b/docs/reference/boxPlotGG_data_TreatmentDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/boxPlotGG_data_Treatment_numericDS.html b/docs/reference/boxPlotGG_data_Treatment_numericDS.html
index 1aa7bd26..4dd00885 100644
--- a/docs/reference/boxPlotGG_data_Treatment_numericDS.html
+++ b/docs/reference/boxPlotGG_data_Treatment_numericDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/bp_standardsDS.html b/docs/reference/bp_standardsDS.html
index b7e661c4..733a4804 100644
--- a/docs/reference/bp_standardsDS.html
+++ b/docs/reference/bp_standardsDS.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/cDS.html b/docs/reference/cDS.html
index 3cc043db..2ffc1148 100644
--- a/docs/reference/cDS.html
+++ b/docs/reference/cDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/cbindDS.html b/docs/reference/cbindDS.html
index 3bed8b0a..b8b31245 100644
--- a/docs/reference/cbindDS.html
+++ b/docs/reference/cbindDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/changeRefGroupDS.html b/docs/reference/changeRefGroupDS.html
index fbf6ba5f..c33cd976 100644
--- a/docs/reference/changeRefGroupDS.html
+++ b/docs/reference/changeRefGroupDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/checkNegValueDS.html b/docs/reference/checkNegValueDS.html
index e9d00fca..04101e3e 100644
--- a/docs/reference/checkNegValueDS.html
+++ b/docs/reference/checkNegValueDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/checkPermissivePrivacyControlLevel.html b/docs/reference/checkPermissivePrivacyControlLevel.html
index 6c19c2b0..962d61c6 100644
--- a/docs/reference/checkPermissivePrivacyControlLevel.html
+++ b/docs/reference/checkPermissivePrivacyControlLevel.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/classDS.html b/docs/reference/classDS.html
index 47976968..107f1659 100644
--- a/docs/reference/classDS.html
+++ b/docs/reference/classDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/colnamesDS.html b/docs/reference/colnamesDS.html
index 4282c514..10e7d0e9 100644
--- a/docs/reference/colnamesDS.html
+++ b/docs/reference/colnamesDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/completeCasesDS.html b/docs/reference/completeCasesDS.html
index d84a6ede..3c77cf08 100644
--- a/docs/reference/completeCasesDS.html
+++ b/docs/reference/completeCasesDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/corDS.html b/docs/reference/corDS.html
index a1972b2c..00770184 100644
--- a/docs/reference/corDS.html
+++ b/docs/reference/corDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/corTestDS.html b/docs/reference/corTestDS.html
index 40678688..fe0e9a3c 100644
--- a/docs/reference/corTestDS.html
+++ b/docs/reference/corTestDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/covDS.html b/docs/reference/covDS.html
index b92bbd44..45147a8e 100644
--- a/docs/reference/covDS.html
+++ b/docs/reference/covDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dataFrameDS.html b/docs/reference/dataFrameDS.html
index 8791fbbe..ba349247 100644
--- a/docs/reference/dataFrameDS.html
+++ b/docs/reference/dataFrameDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dataFrameFillDS.html b/docs/reference/dataFrameFillDS.html
index 6114470e..08a058c5 100644
--- a/docs/reference/dataFrameFillDS.html
+++ b/docs/reference/dataFrameFillDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dataFrameSortDS.html b/docs/reference/dataFrameSortDS.html
index d8e8cd13..ba4bc8cf 100644
--- a/docs/reference/dataFrameSortDS.html
+++ b/docs/reference/dataFrameSortDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dataFrameSubsetDS1.html b/docs/reference/dataFrameSubsetDS1.html
index 98c1bb41..392231b0 100644
--- a/docs/reference/dataFrameSubsetDS1.html
+++ b/docs/reference/dataFrameSubsetDS1.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dataFrameSubsetDS2.html b/docs/reference/dataFrameSubsetDS2.html
index 91a1413e..4f976476 100644
--- a/docs/reference/dataFrameSubsetDS2.html
+++ b/docs/reference/dataFrameSubsetDS2.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/densityGridDS.html b/docs/reference/densityGridDS.html
index b84830f0..4326881e 100644
--- a/docs/reference/densityGridDS.html
+++ b/docs/reference/densityGridDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dimDS.html b/docs/reference/dimDS.html
index 36ae7dbf..978a17ae 100644
--- a/docs/reference/dimDS.html
+++ b/docs/reference/dimDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dmtC2SDS.html b/docs/reference/dmtC2SDS.html
index e5bce26b..2dfce50b 100644
--- a/docs/reference/dmtC2SDS.html
+++ b/docs/reference/dmtC2SDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/dsBase-package.html b/docs/reference/dsBase-package.html
index 36aa5804..7b685ecd 100644
--- a/docs/reference/dsBase-package.html
+++ b/docs/reference/dsBase-package.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/elsplineDS.html b/docs/reference/elsplineDS.html
index 699ad119..b49663ff 100644
--- a/docs/reference/elsplineDS.html
+++ b/docs/reference/elsplineDS.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/extractQuantilesDS1.html b/docs/reference/extractQuantilesDS1.html
index 8db3348b..737a022f 100644
--- a/docs/reference/extractQuantilesDS1.html
+++ b/docs/reference/extractQuantilesDS1.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/extractQuantilesDS2.html b/docs/reference/extractQuantilesDS2.html
index ab0bab81..1bc21891 100644
--- a/docs/reference/extractQuantilesDS2.html
+++ b/docs/reference/extractQuantilesDS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/gamlssDS.html b/docs/reference/gamlssDS.html
index fc7898fe..506f33aa 100644
--- a/docs/reference/gamlssDS.html
+++ b/docs/reference/gamlssDS.html
@@ -23,7 +23,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/getWGSRDS.html b/docs/reference/getWGSRDS.html
index 7ed44dbb..fe30a859 100644
--- a/docs/reference/getWGSRDS.html
+++ b/docs/reference/getWGSRDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmDS1.html b/docs/reference/glmDS1.html
index ecd2010f..4a752e2d 100644
--- a/docs/reference/glmDS1.html
+++ b/docs/reference/glmDS1.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmDS2.html b/docs/reference/glmDS2.html
index 03731c72..bf885f71 100644
--- a/docs/reference/glmDS2.html
+++ b/docs/reference/glmDS2.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmPredictDS.ag.html b/docs/reference/glmPredictDS.ag.html
index 8d31da48..62d1c17f 100644
--- a/docs/reference/glmPredictDS.ag.html
+++ b/docs/reference/glmPredictDS.ag.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmPredictDS.as.html b/docs/reference/glmPredictDS.as.html
index 62461b0b..c3522e90 100644
--- a/docs/reference/glmPredictDS.as.html
+++ b/docs/reference/glmPredictDS.as.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmSLMADS.assign.html b/docs/reference/glmSLMADS.assign.html
index 7a63760d..18208778 100644
--- a/docs/reference/glmSLMADS.assign.html
+++ b/docs/reference/glmSLMADS.assign.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmSLMADS1.html b/docs/reference/glmSLMADS1.html
index a4d8badd..326b4688 100644
--- a/docs/reference/glmSLMADS1.html
+++ b/docs/reference/glmSLMADS1.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmSLMADS2.html b/docs/reference/glmSLMADS2.html
index b50e51c9..4ce4fc57 100644
--- a/docs/reference/glmSLMADS2.html
+++ b/docs/reference/glmSLMADS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmSummaryDS.ag.html b/docs/reference/glmSummaryDS.ag.html
index e0f2239e..33a50104 100644
--- a/docs/reference/glmSummaryDS.ag.html
+++ b/docs/reference/glmSummaryDS.ag.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmSummaryDS.as.html b/docs/reference/glmSummaryDS.as.html
index ca99af8e..d062eda8 100644
--- a/docs/reference/glmSummaryDS.as.html
+++ b/docs/reference/glmSummaryDS.as.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmerSLMADS.assign.html b/docs/reference/glmerSLMADS.assign.html
index 983b845e..984e1ea4 100644
--- a/docs/reference/glmerSLMADS.assign.html
+++ b/docs/reference/glmerSLMADS.assign.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/glmerSLMADS2.html b/docs/reference/glmerSLMADS2.html
index d1c2c9c2..84c47acb 100644
--- a/docs/reference/glmerSLMADS2.html
+++ b/docs/reference/glmerSLMADS2.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/heatmapPlotDS.html b/docs/reference/heatmapPlotDS.html
index 7c0acfa9..64dad8a2 100644
--- a/docs/reference/heatmapPlotDS.html
+++ b/docs/reference/heatmapPlotDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/hetcorDS.html b/docs/reference/hetcorDS.html
index f080e55c..d1ed8860 100644
--- a/docs/reference/hetcorDS.html
+++ b/docs/reference/hetcorDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/histogramDS1.html b/docs/reference/histogramDS1.html
index 3d90be9e..8b8c65ad 100644
--- a/docs/reference/histogramDS1.html
+++ b/docs/reference/histogramDS1.html
@@ -23,7 +23,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/histogramDS2.html b/docs/reference/histogramDS2.html
index 21f77287..c89e0843 100644
--- a/docs/reference/histogramDS2.html
+++ b/docs/reference/histogramDS2.html
@@ -21,7 +21,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/igb_standardsDS.html b/docs/reference/igb_standardsDS.html
index 56a62b4a..653f7718 100644
--- a/docs/reference/igb_standardsDS.html
+++ b/docs/reference/igb_standardsDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/index.html b/docs/reference/index.html
index ce6e0a97..a81cedd3 100644
--- a/docs/reference/index.html
+++ b/docs/reference/index.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/isNaDS.html b/docs/reference/isNaDS.html
index 60110a6c..c6234365 100644
--- a/docs/reference/isNaDS.html
+++ b/docs/reference/isNaDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/isValidDS.html b/docs/reference/isValidDS.html
index 453aa84d..9368da66 100644
--- a/docs/reference/isValidDS.html
+++ b/docs/reference/isValidDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/kurtosisDS1.html b/docs/reference/kurtosisDS1.html
index 6c942ba4..654f0f45 100644
--- a/docs/reference/kurtosisDS1.html
+++ b/docs/reference/kurtosisDS1.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/kurtosisDS2.html b/docs/reference/kurtosisDS2.html
index a3be6590..f03b7e81 100644
--- a/docs/reference/kurtosisDS2.html
+++ b/docs/reference/kurtosisDS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lengthDS.html b/docs/reference/lengthDS.html
index 550e337b..445ec690 100644
--- a/docs/reference/lengthDS.html
+++ b/docs/reference/lengthDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/levelsDS.html b/docs/reference/levelsDS.html
index 93bec9bb..add624c2 100644
--- a/docs/reference/levelsDS.html
+++ b/docs/reference/levelsDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lexisDS1.html b/docs/reference/lexisDS1.html
index d59e1378..5142ba62 100644
--- a/docs/reference/lexisDS1.html
+++ b/docs/reference/lexisDS1.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lexisDS2.html b/docs/reference/lexisDS2.html
index 9e1e61a3..3ed488c7 100644
--- a/docs/reference/lexisDS2.html
+++ b/docs/reference/lexisDS2.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lexisDS3.html b/docs/reference/lexisDS3.html
index 97182f3d..4b128681 100644
--- a/docs/reference/lexisDS3.html
+++ b/docs/reference/lexisDS3.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/listDS.html b/docs/reference/listDS.html
index 8e1f3729..8d4a7c1a 100644
--- a/docs/reference/listDS.html
+++ b/docs/reference/listDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/listDisclosureSettingsDS.html b/docs/reference/listDisclosureSettingsDS.html
index 37e561ee..8a357ea2 100644
--- a/docs/reference/listDisclosureSettingsDS.html
+++ b/docs/reference/listDisclosureSettingsDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lmerSLMADS.assign.html b/docs/reference/lmerSLMADS.assign.html
index 160ae781..926390d9 100644
--- a/docs/reference/lmerSLMADS.assign.html
+++ b/docs/reference/lmerSLMADS.assign.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lmerSLMADS2.html b/docs/reference/lmerSLMADS2.html
index e34c8da9..1b3b1e08 100644
--- a/docs/reference/lmerSLMADS2.html
+++ b/docs/reference/lmerSLMADS2.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lsDS.html b/docs/reference/lsDS.html
index 886204b6..e1584a8a 100644
--- a/docs/reference/lsDS.html
+++ b/docs/reference/lsDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/lsplineDS.html b/docs/reference/lsplineDS.html
index bced6894..8ebc4fdb 100644
--- a/docs/reference/lsplineDS.html
+++ b/docs/reference/lsplineDS.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixDS.html b/docs/reference/matrixDS.html
index c095cf58..4fd12e4b 100644
--- a/docs/reference/matrixDS.html
+++ b/docs/reference/matrixDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixDetDS1.html b/docs/reference/matrixDetDS1.html
index 1f6f482a..58e680b9 100644
--- a/docs/reference/matrixDetDS1.html
+++ b/docs/reference/matrixDetDS1.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixDetDS2.html b/docs/reference/matrixDetDS2.html
index 85e2457e..3d61f58a 100644
--- a/docs/reference/matrixDetDS2.html
+++ b/docs/reference/matrixDetDS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixDiagDS.html b/docs/reference/matrixDiagDS.html
index 8939f343..eb393686 100644
--- a/docs/reference/matrixDiagDS.html
+++ b/docs/reference/matrixDiagDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixDimnamesDS.html b/docs/reference/matrixDimnamesDS.html
index bb2d6cfb..6c004859 100644
--- a/docs/reference/matrixDimnamesDS.html
+++ b/docs/reference/matrixDimnamesDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixInvertDS.html b/docs/reference/matrixInvertDS.html
index 31bf8aee..859560e2 100644
--- a/docs/reference/matrixInvertDS.html
+++ b/docs/reference/matrixInvertDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixMultDS.html b/docs/reference/matrixMultDS.html
index 4a473555..0e2089e0 100644
--- a/docs/reference/matrixMultDS.html
+++ b/docs/reference/matrixMultDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/matrixTransposeDS.html b/docs/reference/matrixTransposeDS.html
index 2dc8d9a7..eafafa7f 100644
--- a/docs/reference/matrixTransposeDS.html
+++ b/docs/reference/matrixTransposeDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/mdPatternDS.html b/docs/reference/mdPatternDS.html
index 6ed7c777..c4bba870 100644
--- a/docs/reference/mdPatternDS.html
+++ b/docs/reference/mdPatternDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/meanDS.html b/docs/reference/meanDS.html
index 7806e4e4..d0fa735d 100644
--- a/docs/reference/meanDS.html
+++ b/docs/reference/meanDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/meanSdGpDS.html b/docs/reference/meanSdGpDS.html
index da49bc49..10e6d4c6 100644
--- a/docs/reference/meanSdGpDS.html
+++ b/docs/reference/meanSdGpDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/mergeDS.html b/docs/reference/mergeDS.html
index 3687174e..9f7e8b90 100644
--- a/docs/reference/mergeDS.html
+++ b/docs/reference/mergeDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/messageDS.html b/docs/reference/messageDS.html
index ec5f3f82..d06fb722 100644
--- a/docs/reference/messageDS.html
+++ b/docs/reference/messageDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/metadataDS.html b/docs/reference/metadataDS.html
index 83b97211..9809dedf 100644
--- a/docs/reference/metadataDS.html
+++ b/docs/reference/metadataDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/miceDS.html b/docs/reference/miceDS.html
index e8d36df9..22359341 100644
--- a/docs/reference/miceDS.html
+++ b/docs/reference/miceDS.html
@@ -23,7 +23,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/minMaxRandDS.html b/docs/reference/minMaxRandDS.html
index 573110da..8da03fb2 100644
--- a/docs/reference/minMaxRandDS.html
+++ b/docs/reference/minMaxRandDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/namesDS.html b/docs/reference/namesDS.html
index c7de77a6..1a3f8cd7 100644
--- a/docs/reference/namesDS.html
+++ b/docs/reference/namesDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/nsDS.html b/docs/reference/nsDS.html
index 7d74fa0b..5573aecc 100644
--- a/docs/reference/nsDS.html
+++ b/docs/reference/nsDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/numNaDS.html b/docs/reference/numNaDS.html
index 7599a247..ccb1a8bd 100644
--- a/docs/reference/numNaDS.html
+++ b/docs/reference/numNaDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/qlsplineDS.html b/docs/reference/qlsplineDS.html
index 5db49162..ae647ca2 100644
--- a/docs/reference/qlsplineDS.html
+++ b/docs/reference/qlsplineDS.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/quantileMeanDS.html b/docs/reference/quantileMeanDS.html
index 741edf5f..c05c2f77 100644
--- a/docs/reference/quantileMeanDS.html
+++ b/docs/reference/quantileMeanDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rBinomDS.html b/docs/reference/rBinomDS.html
index fe27c36a..79ede53b 100644
--- a/docs/reference/rBinomDS.html
+++ b/docs/reference/rBinomDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rNormDS.html b/docs/reference/rNormDS.html
index 8f07ac7f..c8b84df5 100644
--- a/docs/reference/rNormDS.html
+++ b/docs/reference/rNormDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rPoisDS.html b/docs/reference/rPoisDS.html
index 5eae496f..481f25d2 100644
--- a/docs/reference/rPoisDS.html
+++ b/docs/reference/rPoisDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rUnifDS.html b/docs/reference/rUnifDS.html
index 5fdd2c11..bfad7b29 100644
--- a/docs/reference/rUnifDS.html
+++ b/docs/reference/rUnifDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rangeDS.html b/docs/reference/rangeDS.html
index e05a1a91..a5b8f7b8 100644
--- a/docs/reference/rangeDS.html
+++ b/docs/reference/rangeDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/ranksSecureDS1.html b/docs/reference/ranksSecureDS1.html
index 6ed0128f..0c281d79 100644
--- a/docs/reference/ranksSecureDS1.html
+++ b/docs/reference/ranksSecureDS1.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/ranksSecureDS2.html b/docs/reference/ranksSecureDS2.html
index 904eee81..d194174c 100644
--- a/docs/reference/ranksSecureDS2.html
+++ b/docs/reference/ranksSecureDS2.html
@@ -24,7 +24,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/ranksSecureDS3.html b/docs/reference/ranksSecureDS3.html
index 3d5df277..53137542 100644
--- a/docs/reference/ranksSecureDS3.html
+++ b/docs/reference/ranksSecureDS3.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/ranksSecureDS4.html b/docs/reference/ranksSecureDS4.html
index ae6ef70a..d82516bd 100644
--- a/docs/reference/ranksSecureDS4.html
+++ b/docs/reference/ranksSecureDS4.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/ranksSecureDS5.html b/docs/reference/ranksSecureDS5.html
index 1b6788c3..4903f733 100644
--- a/docs/reference/ranksSecureDS5.html
+++ b/docs/reference/ranksSecureDS5.html
@@ -20,7 +20,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rbindDS.html b/docs/reference/rbindDS.html
index 43b5148a..73c7e777 100644
--- a/docs/reference/rbindDS.html
+++ b/docs/reference/rbindDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/reShapeDS.html b/docs/reference/reShapeDS.html
index 3efbac3d..a3783c37 100644
--- a/docs/reference/reShapeDS.html
+++ b/docs/reference/reShapeDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/recodeLevelsDS.html b/docs/reference/recodeLevelsDS.html
index a2d5b275..50c2e55c 100644
--- a/docs/reference/recodeLevelsDS.html
+++ b/docs/reference/recodeLevelsDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/recodeValuesDS.html b/docs/reference/recodeValuesDS.html
index da0679e3..5adf8999 100644
--- a/docs/reference/recodeValuesDS.html
+++ b/docs/reference/recodeValuesDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/repDS.html b/docs/reference/repDS.html
index d7a1fb03..5375fbd3 100644
--- a/docs/reference/repDS.html
+++ b/docs/reference/repDS.html
@@ -21,7 +21,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/replaceNaDS.html b/docs/reference/replaceNaDS.html
index 60d2bb00..5e26e986 100644
--- a/docs/reference/replaceNaDS.html
+++ b/docs/reference/replaceNaDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rmDS.html b/docs/reference/rmDS.html
index 0e722d5b..240767b7 100644
--- a/docs/reference/rmDS.html
+++ b/docs/reference/rmDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/rowColCalcDS.html b/docs/reference/rowColCalcDS.html
index d5acc41a..8d4ab25e 100644
--- a/docs/reference/rowColCalcDS.html
+++ b/docs/reference/rowColCalcDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/sampleDS.html b/docs/reference/sampleDS.html
index 9e63a62b..36b144f5 100644
--- a/docs/reference/sampleDS.html
+++ b/docs/reference/sampleDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/scatterPlotDS.html b/docs/reference/scatterPlotDS.html
index e7391a39..200b2e38 100644
--- a/docs/reference/scatterPlotDS.html
+++ b/docs/reference/scatterPlotDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/seqDS.html b/docs/reference/seqDS.html
index 5436c17f..355ba5a9 100644
--- a/docs/reference/seqDS.html
+++ b/docs/reference/seqDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/setSeedDS.html b/docs/reference/setSeedDS.html
index 3f93d5d5..f5a48255 100644
--- a/docs/reference/setSeedDS.html
+++ b/docs/reference/setSeedDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/skewnessDS1.html b/docs/reference/skewnessDS1.html
index 7fcff17c..18856c27 100644
--- a/docs/reference/skewnessDS1.html
+++ b/docs/reference/skewnessDS1.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/skewnessDS2.html b/docs/reference/skewnessDS2.html
index 96ca37f2..044b0cfb 100644
--- a/docs/reference/skewnessDS2.html
+++ b/docs/reference/skewnessDS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/sqrtDS.html b/docs/reference/sqrtDS.html
index 7b232fd0..4bb74aae 100644
--- a/docs/reference/sqrtDS.html
+++ b/docs/reference/sqrtDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/subsetByClassDS.html b/docs/reference/subsetByClassDS.html
index fc546a46..7d022642 100644
--- a/docs/reference/subsetByClassDS.html
+++ b/docs/reference/subsetByClassDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/subsetDS.html b/docs/reference/subsetDS.html
index 82f92ba4..7bea1371 100644
--- a/docs/reference/subsetDS.html
+++ b/docs/reference/subsetDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/table1DDS.html b/docs/reference/table1DDS.html
index 574f90e4..a66f87d4 100644
--- a/docs/reference/table1DDS.html
+++ b/docs/reference/table1DDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/table2DDS.html b/docs/reference/table2DDS.html
index b120d9ab..97ce4b0b 100644
--- a/docs/reference/table2DDS.html
+++ b/docs/reference/table2DDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/tableDS.assign.html b/docs/reference/tableDS.assign.html
index 5c5ea7d7..3ce7fadc 100644
--- a/docs/reference/tableDS.assign.html
+++ b/docs/reference/tableDS.assign.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/tableDS.html b/docs/reference/tableDS.html
index 96b9b031..eec81395 100644
--- a/docs/reference/tableDS.html
+++ b/docs/reference/tableDS.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/tableDS2.html b/docs/reference/tableDS2.html
index 360bd692..8cbd6534 100644
--- a/docs/reference/tableDS2.html
+++ b/docs/reference/tableDS2.html
@@ -18,7 +18,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/tapplyDS.assign.html b/docs/reference/tapplyDS.assign.html
index 325a9d7c..abb654ab 100644
--- a/docs/reference/tapplyDS.assign.html
+++ b/docs/reference/tapplyDS.assign.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/tapplyDS.html b/docs/reference/tapplyDS.html
index ba1dec6d..e657b616 100644
--- a/docs/reference/tapplyDS.html
+++ b/docs/reference/tapplyDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/testObjExistsDS.html b/docs/reference/testObjExistsDS.html
index d8baf8bd..879ac5cb 100644
--- a/docs/reference/testObjExistsDS.html
+++ b/docs/reference/testObjExistsDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/unListDS.html b/docs/reference/unListDS.html
index c59d955e..71ee1d0f 100644
--- a/docs/reference/unListDS.html
+++ b/docs/reference/unListDS.html
@@ -19,7 +19,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/uniqueDS.html b/docs/reference/uniqueDS.html
index c65fdb87..890f8f44 100644
--- a/docs/reference/uniqueDS.html
+++ b/docs/reference/uniqueDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/varDS.html b/docs/reference/varDS.html
index f4a05a39..b2951662 100644
--- a/docs/reference/varDS.html
+++ b/docs/reference/varDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
diff --git a/docs/reference/vectorDS.html b/docs/reference/vectorDS.html
index 36faaa54..5660f127 100644
--- a/docs/reference/vectorDS.html
+++ b/docs/reference/vectorDS.html
@@ -17,7 +17,7 @@
dsBase
- 6.3.5.9000
+ 6.3.5
From d79c7d2158265b60204325fb9bc96d59edaac4c3 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Fri, 20 Feb 2026 12:15:29 +0000
Subject: [PATCH 21/58] Removed checking of 'opal'
---
azure-pipelines.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 4a207074..e91b05ad 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -253,7 +253,6 @@ jobs:
echo 'branch:'$(branchName) >> $(datetime).txt
echo 'os:'$(lsb_release -ds) >> $(datetime).txt
echo 'R:'$(R --version | head -n 1) >> $(datetime).txt
- echo 'opal:'$(opal system --opal localhost:8080 --user administrator --password "datashield_test&" --version) >> $(datetime).txt
workingDirectory: $(Pipeline.Workspace)/logs
displayName: 'Write versions to file'
From fbdfa42b431b6148ae8ad7ed0e0158d7a6db7f57 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Fri, 10 Apr 2026 11:38:37 +0100
Subject: [PATCH 22/58] Permit perf test duration to be set, seconds, by
environment variable 'PERF_DURATION_SEC'
---
tests/testthat/test-perf-meanDS.R | 6 +++---
tests/testthat/test-perf-varDS.R | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tests/testthat/test-perf-meanDS.R b/tests/testthat/test-perf-meanDS.R
index 794e61b2..947c46ef 100644
--- a/tests/testthat/test-perf-meanDS.R
+++ b/tests/testthat/test-perf-meanDS.R
@@ -1,5 +1,5 @@
#-------------------------------------------------------------------------------
-# Copyright (c) 2024 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
+# Copyright (c) 2024-2026 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
#
# This program and the accompanying materials
# are made available under the terms of the GNU Public License v3.0.
@@ -30,7 +30,7 @@ test_that("numeric meanDS - performance", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
@@ -65,7 +65,7 @@ test_that("numeric meanDS, with NA - performance", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
diff --git a/tests/testthat/test-perf-varDS.R b/tests/testthat/test-perf-varDS.R
index d468c5da..1e81e646 100644
--- a/tests/testthat/test-perf-varDS.R
+++ b/tests/testthat/test-perf-varDS.R
@@ -30,7 +30,7 @@ test_that("numeric varDS - performance", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
@@ -65,7 +65,7 @@ test_that("numeric varDS, with NA - performance", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
From 1f12d53330c09ea6107fa8b1fecfe4b0ac530af2 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Fri, 10 Apr 2026 11:54:51 +0100
Subject: [PATCH 23/58] Permit perf test duration to be set, seconds, by
environment variable 'PERF_DURATION_SEC'
---
tests/testthat/test-perf-meanDS.R | 4 ++--
tests/testthat/test-perf-varDS.R | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/tests/testthat/test-perf-meanDS.R b/tests/testthat/test-perf-meanDS.R
index 794e61b2..5004a995 100644
--- a/tests/testthat/test-perf-meanDS.R
+++ b/tests/testthat/test-perf-meanDS.R
@@ -30,7 +30,7 @@ test_that("numeric meanDS - performance", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
@@ -65,7 +65,7 @@ test_that("numeric meanDS, with NA - performance", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
diff --git a/tests/testthat/test-perf-varDS.R b/tests/testthat/test-perf-varDS.R
index d468c5da..1e81e646 100644
--- a/tests/testthat/test-perf-varDS.R
+++ b/tests/testthat/test-perf-varDS.R
@@ -30,7 +30,7 @@ test_that("numeric varDS - performance", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
@@ -65,7 +65,7 @@ test_that("numeric varDS, with NA - performance", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- .durationSec <- 30 # seconds
+ .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
From e75797beb347b98c37e966937c24e0c8f2a4bf1b Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Mon, 13 Apr 2026 12:35:23 +0100
Subject: [PATCH 24/58] Refactor perf test duration obtaining
---
tests/testthat/perf_tests/perf_rate.R | 5 +++++
tests/testthat/test-perf-meanDS.R | 4 ++--
tests/testthat/test-perf-varDS.R | 4 ++--
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/tests/testthat/perf_tests/perf_rate.R b/tests/testthat/perf_tests/perf_rate.R
index 90905e12..b8930889 100644
--- a/tests/testthat/perf_tests/perf_rate.R
+++ b/tests/testthat/perf_tests/perf_rate.R
@@ -45,6 +45,11 @@ perf.reference.save <- function(perf.ref.name, rate, tolerance.lower, tolerance.
.perf.reference <<- .perf.reference
}
+# Obtain performance test duration from PERF_DURATION_SEC environment variable, otherwise default.duration argument, otherwise "30".
+perf.testduration <- function(default.duration = 30) {
+ base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = base::as.character(default.duration)))
+}
+
perf.reference.rate <- function(perf.ref.name) {
if (is.null(.perf.reference))
.load.pref()
diff --git a/tests/testthat/test-perf-meanDS.R b/tests/testthat/test-perf-meanDS.R
index 5004a995..e0915068 100644
--- a/tests/testthat/test-perf-meanDS.R
+++ b/tests/testthat/test-perf-meanDS.R
@@ -30,7 +30,7 @@ test_that("numeric meanDS - performance", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
+ .durationSec <- perf.testduration(30)
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
@@ -65,7 +65,7 @@ test_that("numeric meanDS, with NA - performance", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
+ .durationSec <- perf.testduration(30)
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
diff --git a/tests/testthat/test-perf-varDS.R b/tests/testthat/test-perf-varDS.R
index 1e81e646..5d9cec4a 100644
--- a/tests/testthat/test-perf-varDS.R
+++ b/tests/testthat/test-perf-varDS.R
@@ -30,7 +30,7 @@ test_that("numeric varDS - performance", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
+ .durationSec <- perf.testduration(30)
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
@@ -65,7 +65,7 @@ test_that("numeric varDS, with NA - performance", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- .durationSec <- base::as.integer(base::Sys.getenv("PERF_DURATION_SEC", unset = "30")) # defaults to 30 seconds
+ .durationSec <- perf.testduration(30)
.count <- 0
.start.time <- Sys.time()
.current.time <- .start.time
From b24d923ebfae39cfd2888a6942f27e1e3bf880b5 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 15:53:56 +0200
Subject: [PATCH 25/58] refactor: unListDS and replaceNaDS use
.loadServersideObject
---
R/replaceNaDS.R | 8 +++++---
R/unListDS.R | 9 ++-------
tests/testthat/test-smk-replaceNaDS.R | 2 +-
3 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/R/replaceNaDS.R b/R/replaceNaDS.R
index 007e12ce..698fc018 100644
--- a/R/replaceNaDS.R
+++ b/R/replaceNaDS.R
@@ -8,15 +8,17 @@
#' it might be more sensible to replace all missing values by one specific value e.g.
#' replace all missing values in a vector by the mean or median value. Once the missing
#' values have been replaced a new vector is created.
-#' @param xvect a character, the name of the vector to process.
+#' @param x a character, the name of the vector to process.
#' @param replacements a vector which contains the replacement value(s), a vector one or
#' more values for each study.
#' @return a new vector without missing values
#' @author Amadou Gaye, Demetris Avraam for DataSHIELD Development Team
#' @export
#'
-replaceNaDS <- function(xvect, replacements){
-
+replaceNaDS <- function(x, replacements){
+
+ xvect <- .loadServersideObject(x)
+
# check if the input vector is valid (i.e. meets DataSHIELD criteria)
check <- dsBase::isValidDS(xvect)
diff --git a/R/unListDS.R b/R/unListDS.R
index 79e853a8..9b620491 100644
--- a/R/unListDS.R
+++ b/R/unListDS.R
@@ -35,13 +35,8 @@
#'
unListDS <- function(x.name) {
- if (is.character(x.name)) {
- listvar<-eval(parse(text=x.name), envir = parent.frame())
- } else {
- studysideMessage<-"ERROR: x.name must be specified as a character string"
- stop(studysideMessage, call. = FALSE)
- }
-
+ listvar <- .loadServersideObject(x.name)
+
outvar<-unlist(listvar)
return(outvar)
diff --git a/tests/testthat/test-smk-replaceNaDS.R b/tests/testthat/test-smk-replaceNaDS.R
index b2b4cfff..8d9c49d7 100644
--- a/tests/testthat/test-smk-replaceNaDS.R
+++ b/tests/testthat/test-smk-replaceNaDS.R
@@ -26,7 +26,7 @@ test_that("simple replaceNaDS", {
input <- c(0.0, NA, 2.0, NA, 4.0, NA, 6.0, NA)
replacements <- c(1.1, 3.3, 5.5, 7.7)
- res <- replaceNaDS(input, replacements)
+ res <- replaceNaDS("input", replacements)
expect_equal(class(res), "numeric")
expect_length(res, 8)
From 9a84af18a5e05448c5c8af84933b4fbdeea68edf Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 15:54:08 +0200
Subject: [PATCH 26/58] refactor: dataFrameFillDS, mergeDS, recodeValuesDS use
.loadServersideObject
---
R/dataFrameFillDS.R | 2 +-
R/mergeDS.R | 15 ++---
R/recodeValuesDS.R | 11 ++--
tests/testthat/test-smk-dataFrameFillDS.R | 7 ++
tests/testthat/test-smk-mergeDS.R | 80 +++++++++++++++++++++++
tests/testthat/test-smk-recodeValuesDS.R | 16 +++++
6 files changed, 112 insertions(+), 19 deletions(-)
create mode 100644 tests/testthat/test-smk-mergeDS.R
diff --git a/R/dataFrameFillDS.R b/R/dataFrameFillDS.R
index 75f093f5..7f8d404a 100644
--- a/R/dataFrameFillDS.R
+++ b/R/dataFrameFillDS.R
@@ -21,7 +21,7 @@
#'
dataFrameFillDS <- function(df.name, allNames.transmit, class.vect.transmit, levels.vec.transmit){
- data <- eval(parse(text=df.name), envir = parent.frame())
+ data <- .loadServersideObject(df.name)
if(!is.null(allNames.transmit)){
allNames <- unlist(strsplit(allNames.transmit, split=","))
diff --git a/R/mergeDS.R b/R/mergeDS.R
index ce05ab7b..750cb3c9 100644
--- a/R/mergeDS.R
+++ b/R/mergeDS.R
@@ -78,19 +78,12 @@ mergeDS <- function(x.name, y.name, by.x.names.transmit, by.y.names.transmit, al
}
# activate data frame names
- x.data.frame <- eval(parse(text=x.name), envir = parent.frame())
- y.data.frame <- eval(parse(text=y.name), envir = parent.frame())
+ x.data.frame <- .loadServersideObject(x.name)
+ y.data.frame <- .loadServersideObject(y.name)
# check data.frames are valid data.frames
- if(!is.data.frame(x.data.frame)){
- studysideMessage <- "Error: x.name must specify a data.frame"
- stop(studysideMessage, call. = FALSE)
- }
-
- if(!is.data.frame(y.data.frame)){
- studysideMessage <- "Error: y.name must specify a data.frame"
- stop(studysideMessage, call. = FALSE)
- }
+ .checkClass(obj = x.data.frame, obj_name = x.name, permitted_classes = c("data.frame"))
+ .checkClass(obj = y.data.frame, obj_name = y.name, permitted_classes = c("data.frame"))
# manage by.x.names and by.y.names
# check text to be activated is not too long because of disclosure risk
diff --git a/R/recodeValuesDS.R b/R/recodeValuesDS.R
index d22a7862..73e57279 100644
--- a/R/recodeValuesDS.R
+++ b/R/recodeValuesDS.R
@@ -59,7 +59,7 @@ recodeValuesDS <- function(var.name.text=NULL, values2replace.text=NULL, new.val
stop(studysideMessage, call. = FALSE)
}
- var2recode <- eval(parse(text=var.name.text), envir = parent.frame())
+ var2recode <- .loadServersideObject(var.name.text)
values2replace <- unlist(strsplit(values2replace.text, split=","))
new.values <- unlist(strsplit(new.values.text, split=","))
@@ -68,13 +68,10 @@ recodeValuesDS <- function(var.name.text=NULL, values2replace.text=NULL, new.val
# get the class of the input variable
var.class <- class(var2recode)
-
- # if the class of the input variable is not factor, numeric, character or integer then
+
+ # if the class of the input variable is not factor, numeric, character or integer then
# stop and return an error message
- if (!(var.class %in% c('factor', 'character', 'numeric', 'integer'))){
- studysideMessage <- "Error: The variable to recode must be either a factor, a character, a numeric or an integer"
- stop(studysideMessage, call. = FALSE)
- }
+ .checkClass(obj = var2recode, obj_name = var.name.text, permitted_classes = c('factor', 'character', 'numeric', 'integer'))
# recode using the recode function from the dplyr package
if (var.class == 'factor'){
diff --git a/tests/testthat/test-smk-dataFrameFillDS.R b/tests/testthat/test-smk-dataFrameFillDS.R
index 8da7a882..326c6c85 100644
--- a/tests/testthat/test-smk-dataFrameFillDS.R
+++ b/tests/testthat/test-smk-dataFrameFillDS.R
@@ -90,6 +90,13 @@ test_that("simple dataFrameFillDS, ascending, numeric", {
expect_equal(res.v6.levels[3], "3")
})
+test_that("dataFrameFillDS errors when object does not exist", {
+ expect_error(
+ dataFrameFillDS("nonexistent_object", "a,b", "numeric,numeric", NULL),
+ regexp = "does not exist"
+ )
+})
+
#
# Shutdown
#
diff --git a/tests/testthat/test-smk-mergeDS.R b/tests/testthat/test-smk-mergeDS.R
new file mode 100644
index 00000000..1fbac070
--- /dev/null
+++ b/tests/testthat/test-smk-mergeDS.R
@@ -0,0 +1,80 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2019-2022 University of Newcastle upon Tyne. All rights reserved.
+# Copyright (c) 2022-2025 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
+#
+# This program and the accompanying materials
+# are made available under the terms of the GNU Public License v3.0.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#-------------------------------------------------------------------------------
+
+#
+# Set up
+#
+
+# context("mergeDS::smk::setup")
+
+set.standard.disclosure.settings()
+
+#
+# Tests
+#
+
+test_that("mergeDS happy path, simple merge", {
+ x.df <- data.frame(id = c(1, 2, 3), val_x = c("a", "b", "c"))
+ y.df <- data.frame(id = c(1, 2, 3), val_y = c("d", "e", "f"))
+
+ res <- mergeDS("x.df", "y.df", "id", "id", FALSE, FALSE, TRUE, ".x,.y", TRUE, NULL)
+
+ expect_true(is.data.frame(res))
+ expect_true("val_x" %in% colnames(res))
+ expect_true("val_y" %in% colnames(res))
+ expect_equal(nrow(res), 3)
+})
+
+test_that("mergeDS errors when x.name object does not exist", {
+ y.df <- data.frame(id = c(1, 2, 3), val_y = c("d", "e", "f"))
+
+ expect_error(
+ mergeDS("nonexistent_object", "y.df", "id", "id", FALSE, FALSE, TRUE, ".x,.y", TRUE, NULL),
+ regexp = "does not exist"
+ )
+})
+
+test_that("mergeDS errors when y.name object does not exist", {
+ x.df <- data.frame(id = c(1, 2, 3), val_x = c("a", "b", "c"))
+
+ expect_error(
+ mergeDS("x.df", "nonexistent_object", "id", "id", FALSE, FALSE, TRUE, ".x,.y", TRUE, NULL),
+ regexp = "does not exist"
+ )
+})
+
+test_that("mergeDS errors when x.name is not a data.frame", {
+ x.df <- c(1, 2, 3)
+ y.df <- data.frame(id = c(1, 2, 3), val_y = c("d", "e", "f"))
+
+ expect_error(
+ mergeDS("x.df", "y.df", "id", "id", FALSE, FALSE, TRUE, ".x,.y", TRUE, NULL),
+ regexp = "must be of type"
+ )
+})
+
+test_that("mergeDS errors when y.name is not a data.frame", {
+ x.df <- data.frame(id = c(1, 2, 3), val_x = c("a", "b", "c"))
+ y.df <- c(1, 2, 3)
+
+ expect_error(
+ mergeDS("x.df", "y.df", "id", "id", FALSE, FALSE, TRUE, ".x,.y", TRUE, NULL),
+ regexp = "must be of type"
+ )
+})
+
+#
+# Done
+#
+
+# context("mergeDS::smk::shutdown")
+
+# context("mergeDS::smk::done")
diff --git a/tests/testthat/test-smk-recodeValuesDS.R b/tests/testthat/test-smk-recodeValuesDS.R
index 09b9e2f3..dcbe39b5 100644
--- a/tests/testthat/test-smk-recodeValuesDS.R
+++ b/tests/testthat/test-smk-recodeValuesDS.R
@@ -123,6 +123,22 @@ test_that("simple recodeValuesDS, character input with missings", {
expect_true(is.na(res[7]))
})
+test_that("recodeValuesDS errors when object does not exist", {
+ expect_error(
+ recodeValuesDS("nonexistent_object", "1,2", "10,20", NULL),
+ regexp = "does not exist"
+ )
+})
+
+test_that("recodeValuesDS errors when object has wrong type", {
+ input <- list(a = 1, b = 2)
+
+ expect_error(
+ recodeValuesDS("input", "1,2", "10,20", NULL),
+ regexp = "must be of type"
+ )
+})
+
#
# Done
#
From 72253247c02be82f026f480a60fc44fc88b51ba5 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 15:54:22 +0200
Subject: [PATCH 27/58] refactor: cbindDS, dataFrameDS, rbindDS use
.loadServersideObject
---
R/cbindDS.R | 12 ++--
R/dataFrameDS.R | 8 ++-
R/rbindDS.R | 2 +-
tests/testthat/test-smk-cbindDS.R | 55 +++++++++++------
tests/testthat/test-smk-dataFrameDS.R | 87 +++++++++++----------------
tests/testthat/test-smk-rbindDS.R | 62 +++++++++----------
6 files changed, 115 insertions(+), 111 deletions(-)
diff --git a/R/cbindDS.R b/R/cbindDS.R
index b7864864..e0ad0b4c 100644
--- a/R/cbindDS.R
+++ b/R/cbindDS.R
@@ -28,11 +28,13 @@ cbindDS <- function(x.names.transmit=NULL, colnames.transmit=NULL){
x.names.input <- x.names.transmit
x.names.act1 <- unlist(strsplit(x.names.input, split=","))
- x.names.act2 <- paste(x.names.act1, collapse=",")
-
- eval.code.x.names <- paste0("data.frame(", x.names.act2, ")")
-
- output.cbind <- eval(parse(text=eval.code.x.names), envir = parent.frame())
+
+ loaded.objects <- vector("list", length(x.names.act1))
+ for(i in seq_along(x.names.act1)) {
+ loaded.objects[[i]] <- .loadServersideObject(x.names.act1[i])
+ }
+
+ output.cbind <- do.call(data.frame, loaded.objects)
colnames.input <- colnames.transmit
colnames.act1 <- unlist(strsplit(colnames.input, split=","))
diff --git a/R/dataFrameDS.R b/R/dataFrameDS.R
index 7a2b36be..7f45c1af 100644
--- a/R/dataFrameDS.R
+++ b/R/dataFrameDS.R
@@ -58,8 +58,12 @@ dataFrameDS <- function(vectors=NULL, r.names=NULL, ch.rows=FALSE, ch.names=TRUE
r.names <- unlist(r.names)
}
- eval.code.vectors.names <- paste0("data.frame(", vectors, ")")
- dtemp0 <- eval(parse(text=eval.code.vectors.names), envir = parent.frame())
+ vectors.names <- unlist(strsplit(vectors, split=","))
+ loaded.vectors <- vector("list", length(vectors.names))
+ for(i in seq_along(vectors.names)) {
+ loaded.vectors[[i]] <- .loadServersideObject(vectors.names[i])
+ }
+ dtemp0 <- do.call(data.frame, loaded.vectors)
dtemp <- data.frame(dtemp0, row.names=r.names, check.rows=ch.rows, check.names=ch.names,
stringsAsFactors=strAsFactors)
diff --git a/R/rbindDS.R b/R/rbindDS.R
index 71e88b17..5b0f6764 100644
--- a/R/rbindDS.R
+++ b/R/rbindDS.R
@@ -60,7 +60,7 @@ rbindDS<-function(x.names.transmit=NULL,colnames.transmit=NULL){
rbind.matrix<-NULL
for(k in numobj:1){
- object.2.rbind<-eval(parse(text=x.names.active[k]), envir = parent.frame())
+ object.2.rbind<-.loadServersideObject(x.names.active[k])
#coerce all input objects to data.matrix (like as.matrix but stays as numeric if numeric)
object.2.rbind<-data.matrix(object.2.rbind)
diff --git a/tests/testthat/test-smk-cbindDS.R b/tests/testthat/test-smk-cbindDS.R
index 11fe1ef3..6a932cb3 100644
--- a/tests/testthat/test-smk-cbindDS.R
+++ b/tests/testthat/test-smk-cbindDS.R
@@ -15,36 +15,57 @@
# context("cbindDS::smk::setup")
+set.standard.disclosure.settings()
+
#
# Tests
#
-# context("cbindDS::smk::simple")
-test_that("simple cbindDS", {
- inputs <- 'input1,input2'
- input1 <- c(0.0, 1.0, 2.0, 3.0)
- input2 <- c(3.0, 2.0, 1.0, 0.0)
- colnames <- 'v1,v2'
+test_that("cbindDS combines vectors into a data.frame", {
+ a <- c(1, 2, 3, 4, 5)
+ b <- c(10, 20, 30, 40, 50)
- res <- cbindDS(inputs, colnames)
+ res <- cbindDS("a,b", "a,b")
expect_equal(class(res), "data.frame")
- expect_length(res, 2)
- expect_equal(class(res[1]), "data.frame")
- expect_equal(class(res[2]), "data.frame")
+ expect_equal(nrow(res), 5)
+ expect_equal(ncol(res), 2)
+ expect_equal(colnames(res), c("a", "b"))
+ expect_equal(res$a, a)
+ expect_equal(res$b, b)
+})
+
+test_that("cbindDS combines data.frame columns via $ syntax", {
+ df <- data.frame(x = c(1, 2, 3, 4, 5), y = c(6, 7, 8, 9, 10))
- res.names <- names(res)
+ res <- cbindDS("df$x,df$y", "df$x,df$y")
- expect_equal(class(res.names), "character")
- expect_length(res.names, 2)
- expect_equal(res.names[1], 'v1')
- expect_equal(res.names[2], 'v2')
+ expect_equal(class(res), "data.frame")
+ expect_equal(nrow(res), 5)
+ expect_equal(ncol(res), 2)
+ expect_equal(colnames(res), c("x", "y"))
+ expect_equal(res$x, df$x)
+ expect_equal(res$y, df$y)
+})
+
+test_that("cbindDS makes duplicate column names unique", {
+ a <- c(1, 2, 3, 4, 5)
+ b <- c(10, 20, 30, 40, 50)
+
+ res <- cbindDS("a,b", "v,v")
+
+ expect_equal(colnames(res), c("v", "v.1"))
+})
+
+test_that("cbindDS errors when object does not exist", {
+ expect_error(
+ cbindDS("nonexistent_obj", "nonexistent_obj"),
+ regexp = "does not exist"
+ )
})
#
# Done
#
-# context("cbindDS::smk::shutdown")
-
# context("cbindDS::smk::done")
diff --git a/tests/testthat/test-smk-dataFrameDS.R b/tests/testthat/test-smk-dataFrameDS.R
index 18fc3b4b..441e5ef9 100644
--- a/tests/testthat/test-smk-dataFrameDS.R
+++ b/tests/testthat/test-smk-dataFrameDS.R
@@ -21,68 +21,51 @@ set.standard.disclosure.settings()
# Tests
#
-# context("dataFrameDS::smk")
-test_that("simple dataFrameDS", {
- v1 <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- v2 <- c(4.0, 3.0, 2.0, 1.0, 0.0)
- vectors <- "v1,v2"
- r.names <- NULL
- ch.rows <- FALSE
- ch.names <- FALSE
- clnames <- "x1,x2"
- strAsFactors <- FALSE
- completeCases <- FALSE
-
- res <- dataFrameDS(vectors, r.names, ch.rows, ch.names, clnames, strAsFactors, completeCases)
+test_that("dataFrameDS creates a data.frame from vectors", {
+ a <- c(1, 2, 3, 4, 5)
+ b <- c(10, 20, 30, 40, 50)
+
+ res <- dataFrameDS("a,b", r.names=NULL, ch.rows=FALSE, ch.names=TRUE,
+ clnames="a,b", strAsFactors=TRUE, completeCases=FALSE)
expect_equal(class(res), "data.frame")
- expect_length(res, 2)
-
- res.classes <- colnames(res)
- expect_length(res.classes, 2)
- expect_equal(res.classes[1], "x1")
- expect_equal(res.classes[2], "x2")
-
- for (index in 1:length(res))
- {
- expect_equal(v1[index], res$x1[index], info = paste0('index=', index, ', column=x1'))
- expect_equal(v2[index], res$x2[index], info = paste0('index=', index, ', column=x2'))
- }
+ expect_equal(nrow(res), 5)
+ expect_equal(ncol(res), 2)
+ expect_equal(colnames(res), c("a", "b"))
+ expect_equal(res$a, a)
+ expect_equal(res$b, b)
})
-test_that("simple dataFrameDS, strAsFactors is TRUE", {
- v1 <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- v2 <- c(4.0, 3.0, 2.0, 1.0, 0.0)
- vectors <- "v1,v2"
- r.names <- NULL
- ch.rows <- FALSE
- ch.names <- FALSE
- clnames <- "x1,x2"
- strAsFactors <- TRUE
- completeCases <- FALSE
+test_that("dataFrameDS handles $ column name syntax", {
+ df <- data.frame(x = c(1, 2, 3, 4, 5), y = c(6, 7, 8, 9, 10))
- res <- dataFrameDS(vectors, r.names, ch.rows, ch.names, clnames, strAsFactors, completeCases)
+ res <- dataFrameDS("df$x,df$y", r.names=NULL, ch.rows=FALSE, ch.names=TRUE,
+ clnames="df$x,df$y", strAsFactors=TRUE, completeCases=FALSE)
expect_equal(class(res), "data.frame")
- expect_length(res, 2)
-
- res.classes <- colnames(res)
- expect_length(res.classes, 2)
- expect_equal(res.classes[1], "x1")
- expect_equal(res.classes[2], "x2")
-
- for (index in 1:length(res))
- {
- expect_equal(v1[index], res$x1[index], info = paste0('index=', index, ', column=x1'))
- expect_equal(v2[index], res$x2[index], info = paste0('index=', index, ', column=x2'))
- }
+ expect_equal(colnames(res), c("x", "y"))
+ expect_equal(res$x, df$x)
+ expect_equal(res$y, df$y)
})
-#
-# Stutdown
-#
+test_that("dataFrameDS removes rows with NAs when completeCases is TRUE", {
+ a <- c(1, NA, 3, 4, 5)
+ b <- c(10, 20, NA, 40, 50)
+
+ res <- dataFrameDS("a,b", r.names=NULL, ch.rows=FALSE, ch.names=TRUE,
+ clnames="a,b", strAsFactors=TRUE, completeCases=TRUE)
-# context("dataFrameDS::smk::shutdown")
+ expect_equal(class(res), "data.frame")
+ expect_equal(nrow(res), 3)
+})
+
+test_that("dataFrameDS errors when object does not exist", {
+ expect_error(
+ dataFrameDS("nonexistent_obj", r.names=NULL, ch.rows=FALSE, ch.names=TRUE,
+ clnames="nonexistent_obj", strAsFactors=TRUE, completeCases=FALSE),
+ regexp = "does not exist"
+ )
+})
#
# Done
diff --git a/tests/testthat/test-smk-rbindDS.R b/tests/testthat/test-smk-rbindDS.R
index 7f757a1e..af99483b 100644
--- a/tests/testthat/test-smk-rbindDS.R
+++ b/tests/testthat/test-smk-rbindDS.R
@@ -15,53 +15,47 @@
# context("rbindDS::smk::setup")
+set.standard.disclosure.settings()
+
#
# Tests
#
-# context("rbindDS::smk::simple")
-test_that("simple rbindDS", {
- inputs <- 'input1, input2'
- input1 <- c(0.0, 1.0, 2.0, 3.0)
- input2 <- c(3.0, 2.0, 1.0, 0.0)
- colnames <- 'v1'
+test_that("rbindDS combines two data.frames by row", {
+ df1 <- data.frame(a = c(1, 2, 3), b = c(4, 5, 6))
+ df2 <- data.frame(a = c(7, 8), b = c(9, 10))
- res <- rbindDS(inputs, colnames)
+ res <- rbindDS("df1,df2", "a,b")
- res.class <- class(res)
- if (base::getRversion() < '4.0.0')
- {
- expect_length(res.class, 1)
- expect_true("matrix" %in% res.class)
- }
- else
- {
- expect_length(res.class, 2)
- expect_true("matrix" %in% res.class)
- expect_true("array" %in% res.class)
- }
+ expect_true(is.matrix(res))
+ expect_equal(nrow(res), 5)
+ expect_equal(ncol(res), 2)
+ expect_equal(colnames(res), c("a", "b"))
+ expect_equal(res[, "a"], c(1, 2, 3, 7, 8))
+ expect_equal(res[, "b"], c(4, 5, 6, 9, 10))
+})
- expect_length(res, 8)
- expect_equal(class(res[1]), "numeric")
- expect_equal(class(res[2]), "numeric")
- expect_equal(class(res[3]), "numeric")
- expect_equal(class(res[4]), "numeric")
- expect_equal(class(res[5]), "numeric")
- expect_equal(class(res[6]), "numeric")
- expect_equal(class(res[7]), "numeric")
- expect_equal(class(res[8]), "numeric")
+test_that("rbindDS combines vectors", {
+ v1 <- c(1, 2, 3)
+ v2 <- c(4, 5, 6)
- res.colnames <- colnames(res)
+ res <- rbindDS("v1,v2", "V1")
- expect_equal(class(res.colnames), "character")
- expect_length(res.colnames, 1)
- expect_equal(res.colnames[1], 'v1')
+ expect_true(is.matrix(res))
+ expect_equal(nrow(res), 6)
+ expect_equal(ncol(res), 1)
+ expect_equal(colnames(res), "V1")
+})
+
+test_that("rbindDS errors when object does not exist", {
+ expect_error(
+ rbindDS("nonexistent_obj", "a"),
+ regexp = "does not exist"
+ )
})
#
# Done
#
-# context("rbindDS::smk::shutdown")
-
# context("rbindDS::smk::done")
From 2554c55473ed0b6c65772d31cbf1f7fb72d1f597 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 15:54:32 +0200
Subject: [PATCH 28/58] refactor: complex functions use .loadServersideObject
---
R/BooleDS.R | 4 +-
R/dataFrameSortDS.R | 5 +-
R/dataFrameSubsetDS1.R | 15 +++-
R/dataFrameSubsetDS2.R | 15 +++-
R/repDS.R | 8 +-
R/seqDS.R | 22 +++---
tests/testthat/test-smk-BooleDS.R | 20 +++++
tests/testthat/test-smk-dataFrameSortDS.R | 16 ++++
tests/testthat/test-smk-dataFrameSubsetDS1.R | 22 ++++++
tests/testthat/test-smk-dataFrameSubsetDS2.R | 22 ++++++
tests/testthat/test-smk-repDS.R | 83 ++++++++++++++++++++
tests/testthat/test-smk-seqDS.R | 17 ++++
12 files changed, 223 insertions(+), 26 deletions(-)
create mode 100644 tests/testthat/test-smk-repDS.R
diff --git a/R/BooleDS.R b/R/BooleDS.R
index 0f54dfca..70c81941 100644
--- a/R/BooleDS.R
+++ b/R/BooleDS.R
@@ -50,8 +50,8 @@ thr <- dsBase::listDisclosureSettingsDS() #
##########CHECK NOT LONG SPECIFIED VECTOR##############
-V1<-eval(parse(text=V1.name), envir = parent.frame())
-V2<-eval(parse(text=V2.name), envir = parent.frame())
+V1<-.loadServersideObject(V1.name)
+V2<-.loadServersideObject(V2.name)
if(is.character(V1)){
diff --git a/R/dataFrameSortDS.R b/R/dataFrameSortDS.R
index a398a70b..ec7f5e97 100644
--- a/R/dataFrameSortDS.R
+++ b/R/dataFrameSortDS.R
@@ -65,9 +65,8 @@ dataFrameSortDS <- function(df.name=NULL,sort.key.name=NULL,sort.descending,sort
stop(studysideMessage, call. = FALSE)
}
- df.name.2 <- paste0("data.frame(",df.name,")")
- df2sort <- eval(parse(text=df.name.2), envir = parent.frame())
- sort.key <- eval(parse(text=sort.key.name), envir = parent.frame())
+ df2sort <- data.frame(.loadServersideObject(df.name))
+ sort.key <- .loadServersideObject(sort.key.name)
# TYPE CHECK
if(any(class(sort.key) %in% 'factor')){
diff --git a/R/dataFrameSubsetDS1.R b/R/dataFrameSubsetDS1.R
index 4b3c9476..1c76c1ca 100644
--- a/R/dataFrameSubsetDS1.R
+++ b/R/dataFrameSubsetDS1.R
@@ -157,8 +157,7 @@ if(sum(is.na(keep.code.n))>0){
}
}
- df.name.2 <- paste0("data.frame(",df.name,")")
- df2subset <- eval(parse(text=df.name.2), envir = parent.frame())
+ df2subset <- data.frame(.loadServersideObject(df.name))
if(V1.name=="ONES"||V2.name=="ONES")
{
@@ -175,8 +174,16 @@ if(sum(is.na(keep.code.n))>0){
ONES<-V1
}
} else {
- V1 <- eval(parse(text=V1.name), envir = parent.frame())
- V2 <- eval(parse(text=V2.name), envir = parent.frame())
+ V1 <- tryCatch(.loadServersideObject(V1.name), error = function(e) {
+ numeric.val <- suppressWarnings(as.numeric(V1.name))
+ if (is.na(numeric.val)) stop(e)
+ numeric.val
+ })
+ V2 <- tryCatch(.loadServersideObject(V2.name), error = function(e) {
+ numeric.val <- suppressWarnings(as.numeric(V2.name))
+ if (is.na(numeric.val)) stop(e)
+ numeric.val
+ })
}
##########CHECK APPROPRIATE CLASSES ##############
diff --git a/R/dataFrameSubsetDS2.R b/R/dataFrameSubsetDS2.R
index 05938a60..8a9a6ed6 100644
--- a/R/dataFrameSubsetDS2.R
+++ b/R/dataFrameSubsetDS2.R
@@ -177,8 +177,7 @@ if(!is.null(V2.name)){
}
- df.name.2<-paste0("data.frame(",df.name,")")
- df2subset <- eval(parse(text=df.name.2), envir = parent.frame())
+ df2subset <- data.frame(.loadServersideObject(df.name))
if(V1.name=="ONES"||V2.name=="ONES")
{
@@ -195,8 +194,16 @@ if(!is.null(V2.name)){
ONES<-V1
}
}else{
- V1<-eval(parse(text=V1.name), envir = parent.frame())
- V2<-eval(parse(text=V2.name), envir = parent.frame())
+ V1<-tryCatch(.loadServersideObject(V1.name), error = function(e) {
+ numeric.val <- suppressWarnings(as.numeric(V1.name))
+ if (is.na(numeric.val)) stop(e)
+ numeric.val
+ })
+ V2<-tryCatch(.loadServersideObject(V2.name), error = function(e) {
+ numeric.val <- suppressWarnings(as.numeric(V2.name))
+ if (is.na(numeric.val)) stop(e)
+ numeric.val
+ })
}
diff --git a/R/repDS.R b/R/repDS.R
index 61b4e3ea..f6454ea2 100644
--- a/R/repDS.R
+++ b/R/repDS.R
@@ -175,7 +175,7 @@ if(source.x1=="serverside")
{
#x1.transmit is the name of a serverside vector or scalar
-x1.use<-eval(parse(text=x1.transmit), envir = parent.frame())
+x1.use<-.loadServersideObject(x1.transmit)
}
if(source.x1=="clientside")
@@ -276,7 +276,7 @@ else
{
#times.transmit is the name of a serverside vector or scalar
- times.use<-eval(parse(text=times.transmit), envir = parent.frame())
+ times.use<-.loadServersideObject(times.transmit)
}
if(source.times=="clientside")
@@ -364,7 +364,7 @@ else
if(source.length.out=="serverside")
{
#length.out.transmit is the name of the serverside vector or scalar
- length.out.temp<-eval(parse(text=length.out.transmit), envir = parent.frame())
+ length.out.temp<-.loadServersideObject(length.out.transmit)
arg.is.vector<-FALSE
if(length(length.out.temp)>=2)arg.is.vector<-TRUE
@@ -460,7 +460,7 @@ else
if(source.each=="serverside")
{
#each.transmit is the name of the serverside vector or scalar
- each.use<-eval(parse(text=each.transmit), envir = parent.frame())
+ each.use<-.loadServersideObject(each.transmit)
}
if(source.each=="clientside")
diff --git a/R/seqDS.R b/R/seqDS.R
index 97df7c3e..e8af69aa 100644
--- a/R/seqDS.R
+++ b/R/seqDS.R
@@ -65,8 +65,9 @@ nfilter.subset<-as.numeric(thr$nfilter.subset) #
#########################################################################
- if(is.character(FROM.value.char)&&is.numeric(eval(parse(text=FROM.value.char), envir = parent.frame()))){
- FROM<-eval(parse(text=FROM.value.char), envir = parent.frame())
+ FROM.eval <- tryCatch(.loadServersideObject(FROM.value.char), error = function(e) as.numeric(FROM.value.char))
+ if(is.character(FROM.value.char)&&is.numeric(FROM.eval)){
+ FROM<-FROM.eval
}else{
studysideMessage<-"ERROR: FROM.value.char must be specified as a real number in inverted commas eg '-3.74' or '0'"
stop(studysideMessage, call. = FALSE)
@@ -74,9 +75,10 @@ nfilter.subset<-as.numeric(thr$nfilter.subset) #
if(!is.null(TO.value.char))
{
- if(is.character(TO.value.char)&&is.numeric(eval(parse(text=TO.value.char), envir = parent.frame())))
+ TO.eval <- tryCatch(.loadServersideObject(TO.value.char), error = function(e) as.numeric(TO.value.char))
+ if(is.character(TO.value.char)&&is.numeric(TO.eval))
{
- TO<-eval(parse(text=TO.value.char), envir = parent.frame())
+ TO<-TO.eval
}else{
studysideMessage<-"ERROR: TO.value.char must be specified as a real number in inverted commas eg '-3.74' or '0'"
stop(studysideMessage, call. = FALSE)
@@ -88,16 +90,18 @@ nfilter.subset<-as.numeric(thr$nfilter.subset) #
TO<-NULL
}
- if(is.character(BY.value.char)&&is.numeric(eval(parse(text=BY.value.char), envir = parent.frame()))){
- BY<-eval(parse(text=BY.value.char), envir = parent.frame())
+ BY.eval <- tryCatch(.loadServersideObject(BY.value.char), error = function(e) as.numeric(BY.value.char))
+ if(is.character(BY.value.char)&&is.numeric(BY.eval)){
+ BY<-BY.eval
}else{
studysideMessage<-"ERROR: BY.value.char must be specified as a real number in inverted commas eg '-3.74' or '0'"
stop(studysideMessage, call. = FALSE)
}
if(!is.null(LENGTH.OUT.value.char)){
- if(is.character(LENGTH.OUT.value.char)&&is.numeric(eval(parse(text=LENGTH.OUT.value.char), envir = parent.frame()))){
- LENGTH.OUT<-eval(parse(text=LENGTH.OUT.value.char), envir = parent.frame())
+ LENGTH.OUT.eval <- tryCatch(.loadServersideObject(LENGTH.OUT.value.char), error = function(e) as.numeric(LENGTH.OUT.value.char))
+ if(is.character(LENGTH.OUT.value.char)&&is.numeric(LENGTH.OUT.eval)){
+ LENGTH.OUT<-LENGTH.OUT.eval
}else{
studysideMessage<-"ERROR: If LENGTH.OUT.value.char is non-NULL, it must specify a positive integer in inverted commas eg '14'"
stop(studysideMessage, call. = FALSE)
@@ -110,7 +114,7 @@ nfilter.subset<-as.numeric(thr$nfilter.subset) #
if(!is.null(ALONG.WITH.name)){
if(is.character(ALONG.WITH.name)){
- ALONG.WITH<-eval(parse(text=ALONG.WITH.name), envir = parent.frame())
+ ALONG.WITH<-.loadServersideObject(ALONG.WITH.name)
}else{
studysideMessage<-"ERROR: If ALONG.WITH.name is non-NULL, it must specify the name of a serverside vector in inverted commas"
stop(studysideMessage, call. = FALSE)
diff --git a/tests/testthat/test-smk-BooleDS.R b/tests/testthat/test-smk-BooleDS.R
index 5fcfa4ee..685dc0fa 100644
--- a/tests/testthat/test-smk-BooleDS.R
+++ b/tests/testthat/test-smk-BooleDS.R
@@ -15,6 +15,8 @@
# context("BooleDS::smk::setup")
+set.standard.disclosure.settings()
+
#
# Tests
#
@@ -279,6 +281,24 @@ test_that("na-check BooleDS, logical, NA=1", {
expect_equal(res[5], TRUE)
})
+test_that("BooleDS errors when V1 object does not exist", {
+ input <- data.frame(v2 = c(1.0, 2.0, 3.0, 4.0, 5.0))
+
+ expect_error(
+ BooleDS("nonexistent$v1", "input$v2", 1, "NA", TRUE),
+ regexp = "does not exist"
+ )
+})
+
+test_that("BooleDS errors when V2 object does not exist", {
+ input <- data.frame(v1 = c(1.0, 2.0, 3.0, 4.0, 5.0))
+
+ expect_error(
+ BooleDS("input$v1", "nonexistent$v2", 1, "NA", TRUE),
+ regexp = "does not exist"
+ )
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-dataFrameSortDS.R b/tests/testthat/test-smk-dataFrameSortDS.R
index 39a7378b..a61a4c62 100644
--- a/tests/testthat/test-smk-dataFrameSortDS.R
+++ b/tests/testthat/test-smk-dataFrameSortDS.R
@@ -468,6 +468,22 @@ test_that("simple dataFrameSortDS, descending, alphabetic", {
expect_equal(res$v2[8], "6.0")
})
+test_that("dataFrameSortDS errors when df does not exist", {
+ expect_error(
+ dataFrameSortDS("nonexistent", "nonexistent$v1", FALSE, "default"),
+ regexp = "does not exist"
+ )
+})
+
+test_that("dataFrameSortDS errors when sort key does not exist", {
+ df <- data.frame(v1 = c(1, 2, 3, 4, 5, 6, 7, 8), v2 = c(1, 2, 3, 4, 5, 6, 7, 8))
+
+ expect_error(
+ dataFrameSortDS("df", "nonexistent$col", FALSE, "default"),
+ regexp = "does not exist"
+ )
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-dataFrameSubsetDS1.R b/tests/testthat/test-smk-dataFrameSubsetDS1.R
index c519cefa..b70c7993 100644
--- a/tests/testthat/test-smk-dataFrameSubsetDS1.R
+++ b/tests/testthat/test-smk-dataFrameSubsetDS1.R
@@ -74,6 +74,28 @@ test_that("test2 dataFrameSubsetDS1", {
})
+test_that("dataFrameSubsetDS1 errors when df does not exist", {
+ expect_error(
+ dataFrameSubsetDS1(df.name="nonexistent", V1.name="x", V2.name="1",
+ Boolean.operator.n=1, keep.NAs=FALSE),
+ regexp = "does not exist"
+ )
+})
+
+test_that("dataFrameSubsetDS1 errors when V1 object does not exist", {
+ D <- as.data.frame(matrix(NA, nrow=20, ncol=3))
+ colnames(D) <- c('integer','numeric','binary')
+ D$integer <- rep(1, 20)
+ D$numeric <- rep(1, 20)
+ D$binary <- rep(1, 20)
+
+ expect_error(
+ dataFrameSubsetDS1(df.name="D", V1.name="nonexistent$col", V2.name="1",
+ Boolean.operator.n=1, keep.NAs=FALSE),
+ regexp = "does not exist"
+ )
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-dataFrameSubsetDS2.R b/tests/testthat/test-smk-dataFrameSubsetDS2.R
index c93dc595..99968ee4 100644
--- a/tests/testthat/test-smk-dataFrameSubsetDS2.R
+++ b/tests/testthat/test-smk-dataFrameSubsetDS2.R
@@ -71,6 +71,28 @@ test_that("test2 dataFrameSubsetDS2", {
})
+test_that("dataFrameSubsetDS2 errors when df does not exist", {
+ expect_error(
+ dataFrameSubsetDS2(df.name="nonexistent", V1.name="x", V2.name="1",
+ Boolean.operator.n=1, keep.NAs=FALSE),
+ regexp = "does not exist"
+ )
+})
+
+test_that("dataFrameSubsetDS2 errors when V1 object does not exist", {
+ D <- as.data.frame(matrix(NA, nrow=20, ncol=3))
+ colnames(D) <- c('integer','numeric','binary')
+ D$integer <- rep(1, 20)
+ D$numeric <- rep(1, 20)
+ D$binary <- rep(1, 20)
+
+ expect_error(
+ dataFrameSubsetDS2(df.name="D", V1.name="nonexistent$col", V2.name="1",
+ Boolean.operator.n=1, keep.NAs=FALSE),
+ regexp = "does not exist"
+ )
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-repDS.R b/tests/testthat/test-smk-repDS.R
new file mode 100644
index 00000000..c4929f47
--- /dev/null
+++ b/tests/testthat/test-smk-repDS.R
@@ -0,0 +1,83 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2019-2022 University of Newcastle upon Tyne. All rights reserved.
+# Copyright (c) 2022-2025 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
+#
+# This program and the accompanying materials
+# are made available under the terms of the GNU Public License v3.0.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#-------------------------------------------------------------------------------
+
+#
+# Set up
+#
+
+# context("repDS::smk::setup")
+
+set.standard.disclosure.settings()
+
+#
+# Tests
+#
+
+test_that("repDS with serverside scalar x1", {
+ myScalar <- 5
+
+ res <- repDS(x1.transmit="myScalar", times.transmit="3", length.out.transmit=NULL,
+ each.transmit=NULL, x1.includes.characters=FALSE,
+ source.x1="serverside", source.times="clientside",
+ source.length.out=NULL, source.each=NULL)
+
+ expect_equal(res, c(5, 5, 5))
+})
+
+test_that("repDS with serverside vector x1", {
+ myVec <- c(1, 2, 3)
+
+ res <- repDS(x1.transmit="myVec", times.transmit="2", length.out.transmit=NULL,
+ each.transmit=NULL, x1.includes.characters=FALSE,
+ source.x1="serverside", source.times="clientside",
+ source.length.out=NULL, source.each=NULL)
+
+ expect_equal(res, c(1, 2, 3, 1, 2, 3))
+})
+
+test_that("repDS with clientside x1", {
+ res <- repDS(x1.transmit="7", times.transmit="4", length.out.transmit=NULL,
+ each.transmit=NULL, x1.includes.characters=FALSE,
+ source.x1="clientside", source.times="clientside",
+ source.length.out=NULL, source.each=NULL)
+
+ expect_equal(res, c(7, 7, 7, 7))
+})
+
+test_that("repDS errors when serverside x1 object does not exist", {
+ expect_error(
+ repDS(x1.transmit="nonexistent_obj", times.transmit="3", length.out.transmit=NULL,
+ each.transmit=NULL, x1.includes.characters=FALSE,
+ source.x1="serverside", source.times="clientside",
+ source.length.out=NULL, source.each=NULL),
+ regexp = "does not exist"
+ )
+})
+
+test_that("repDS errors when serverside times object does not exist", {
+ myScalar <- 5
+
+ expect_error(
+ repDS(x1.transmit="myScalar", times.transmit="nonexistent_times", length.out.transmit=NULL,
+ each.transmit=NULL, x1.includes.characters=FALSE,
+ source.x1="serverside", source.times="serverside",
+ source.length.out=NULL, source.each=NULL),
+ regexp = "does not exist"
+ )
+})
+
+#
+# Done
+#
+
+# context("repDS::smk::shutdown")
+
+# context("repDS::smk::done")
diff --git a/tests/testthat/test-smk-seqDS.R b/tests/testthat/test-smk-seqDS.R
index 7cdd62eb..3a9edfb6 100644
--- a/tests/testthat/test-smk-seqDS.R
+++ b/tests/testthat/test-smk-seqDS.R
@@ -118,6 +118,23 @@ test_that("simple seqDS", {
expect_equal(res[7], 1.5)
})
+test_that("seqDS with ALONG.WITH server-side vector", {
+ myVec <- c(10, 20, 30, 40, 50)
+
+ res <- seqDS("1", NULL, "1", NULL, "myVec")
+
+ expect_equal(class(res), "numeric")
+ expect_length(res, 5)
+ expect_equal(res, c(1, 2, 3, 4, 5))
+})
+
+test_that("seqDS errors when ALONG.WITH object does not exist", {
+ expect_error(
+ seqDS("1", NULL, "1", NULL, "nonexistent_obj"),
+ regexp = "does not exist"
+ )
+})
+
#
# Done
#
From 65d59040e868ce1071bb363b041f745beca5f904 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Sat, 11 Apr 2026 12:43:20 +0200
Subject: [PATCH 29/58] refactor: move checks to serverside
---
R/corDS.R | 7 +++++--
R/corTestDS.R | 6 ++++--
R/covDS.R | 7 +++++--
R/kurtosisDS1.R | 5 +++--
R/kurtosisDS2.R | 5 +++--
R/meanDS.R | 7 +++++--
R/meanSdGpDS.R | 17 +++++++++++------
R/quantileMeanDS.R | 17 ++++++++++-------
R/skewnessDS1.R | 5 +++--
R/skewnessDS2.R | 5 +++--
R/varDS.R | 7 +++++--
11 files changed, 57 insertions(+), 31 deletions(-)
diff --git a/R/corDS.R b/R/corDS.R
index abc73145..0c3a84a0 100644
--- a/R/corDS.R
+++ b/R/corDS.R
@@ -27,9 +27,12 @@ corDS <- function(x=NULL, y=NULL){
nfilter.glm <- as.numeric(thr$nfilter.glm)
#############################################################
- x.val <- eval(parse(text=x), envir = parent.frame())
+ x.val <- .loadServersideObject(x)
+ .checkClass(obj = x.val, obj_name = x, permitted_classes = c("numeric", "integer", "matrix", "data.frame"))
+
if (!is.null(y)){
- y.val <- eval(parse(text=y), envir = parent.frame())
+ y.val <- .loadServersideObject(y)
+ .checkClass(obj = y.val, obj_name = y, permitted_classes = c("numeric", "integer", "matrix", "data.frame"))
}
else{
y.val <- NULL
diff --git a/R/corTestDS.R b/R/corTestDS.R
index ef5aac33..521cbb55 100644
--- a/R/corTestDS.R
+++ b/R/corTestDS.R
@@ -17,8 +17,10 @@
#'
corTestDS <- function(x, y, method, exact, conf.level){
- x.var <- eval(parse(text=x), envir = parent.frame())
- y.var <- eval(parse(text=y), envir = parent.frame())
+ x.var <- .loadServersideObject(x)
+ .checkClass(obj = x.var, obj_name = x, permitted_classes = c("numeric", "integer"))
+ y.var <- .loadServersideObject(y)
+ .checkClass(obj = y.var, obj_name = y, permitted_classes = c("numeric", "integer"))
# get the number of pairwise complete cases
n <- sum(stats::complete.cases(x.var, y.var))
diff --git a/R/covDS.R b/R/covDS.R
index 9f645b62..15e43830 100644
--- a/R/covDS.R
+++ b/R/covDS.R
@@ -36,9 +36,12 @@ covDS <- function(x=NULL, y=NULL, use=NULL){
#nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
- x.val <- eval(parse(text=x), envir = parent.frame())
+ x.val <- .loadServersideObject(x)
+ .checkClass(obj = x.val, obj_name = x, permitted_classes = c("numeric", "integer", "matrix", "data.frame"))
+
if (!is.null(y)){
- y.val <- eval(parse(text=y), envir = parent.frame())
+ y.val <- .loadServersideObject(y)
+ .checkClass(obj = y.val, obj_name = y, permitted_classes = c("numeric", "integer", "matrix", "data.frame"))
}
else{
y.val <- NULL
diff --git a/R/kurtosisDS1.R b/R/kurtosisDS1.R
index 4f3f4e52..435ff6e2 100644
--- a/R/kurtosisDS1.R
+++ b/R/kurtosisDS1.R
@@ -19,8 +19,9 @@ kurtosisDS1 <- function (x, method){
nfilter.tab <- as.numeric(thr$nfilter.tab)
#############################################################
- x <- eval(parse(text=x), envir = parent.frame())
- x <- x[stats::complete.cases(x)]
+ x.val <- .loadServersideObject(x)
+ .checkClass(obj = x.val, obj_name = x, permitted_classes = c("numeric", "integer"))
+ x <- x.val[stats::complete.cases(x.val)]
if(length(x) < nfilter.tab){
kurtosis.out <- NA
diff --git a/R/kurtosisDS2.R b/R/kurtosisDS2.R
index 1d4e3fec..864ca5aa 100644
--- a/R/kurtosisDS2.R
+++ b/R/kurtosisDS2.R
@@ -23,8 +23,9 @@ kurtosisDS2 <- function(x, global.mean){
nfilter.tab <- as.numeric(thr$nfilter.tab)
#############################################################
- x <- eval(parse(text=x), envir = parent.frame())
- x <- x[stats::complete.cases(x)]
+ x.val <- .loadServersideObject(x)
+ .checkClass(obj = x.val, obj_name = x, permitted_classes = c("numeric", "integer"))
+ x <- x.val[stats::complete.cases(x.val)]
if(length(x) < nfilter.tab){
sum_quartics.out <- NA
diff --git a/R/meanDS.R b/R/meanDS.R
index 59d1bc4e..8e4f8998 100644
--- a/R/meanDS.R
+++ b/R/meanDS.R
@@ -3,12 +3,12 @@
#' @description Calculates the mean value.
#' @details if the length of input vector is less than the set filter
#' a missing value is returned.
-#' @param xvect a vector
+#' @param x a character string, the name of a numeric or integer vector
#' @return a numeric, the statistical mean
#' @author Gaye A, Burton PR
#' @export
#'
-meanDS <- function(xvect){
+meanDS <- function(x){
#############################################################
# MODULE 1: CAPTURE THE nfilter SETTINGS
@@ -19,6 +19,9 @@ meanDS <- function(xvect){
#nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
+ xvect <- .loadServersideObject(x)
+ .checkClass(obj = xvect, obj_name = x, permitted_classes = c("numeric", "integer"))
+
out.mean <- mean(xvect, na.rm=TRUE)
out.numNa <- length(which(is.na(xvect)))
out.totN <- length(xvect)
diff --git a/R/meanSdGpDS.R b/R/meanSdGpDS.R
index 41fdb721..2375250e 100644
--- a/R/meanSdGpDS.R
+++ b/R/meanSdGpDS.R
@@ -3,17 +3,17 @@
#' @description Server-side function called by ds.meanSdGp
#' @details Computes the mean and standard deviation across groups defined by one
#' factor
-#' @param X a client-side supplied character string identifying the variable for which
+#' @param x a client-side supplied character string identifying the variable for which
#' means/SDs are to be calculated
-#' @param INDEX a client-side supplied character string identifying the factor across
+#' @param index a client-side supplied character string identifying the factor across
#' which means/SDs are to be calculated
#' @author Burton PR
-#'
+#'
#' @return List with results from the group statistics
#' @export
#'
-meanSdGpDS <- function (X, INDEX){
-
+meanSdGpDS <- function (x, index){
+
#############################################################
# MODULE 1: CAPTURE THE nfilter SETTINGS
thr <- dsBase::listDisclosureSettingsDS()
@@ -23,9 +23,14 @@ meanSdGpDS <- function (X, INDEX){
#nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
+ X <- .loadServersideObject(x)
+ .checkClass(obj = X, obj_name = x, permitted_classes = c("numeric", "integer"))
+ INDEX <- .loadServersideObject(index)
+ .checkClass(obj = INDEX, obj_name = index, permitted_classes = c("factor", "character", "integer"))
+
FUN.mean <- function(x) {mean(x,na.rm=TRUE)}
FUN.var <- function(x) {stats::var(x,na.rm=TRUE)}
-
+
#Strip missings from both X and INDEX
analysis.matrix<-cbind(X,INDEX)
diff --git a/R/quantileMeanDS.R b/R/quantileMeanDS.R
index 79fe3a96..199aee81 100644
--- a/R/quantileMeanDS.R
+++ b/R/quantileMeanDS.R
@@ -2,18 +2,21 @@
#' @title Generates quantiles and mean information without maximum and minimum
#' @description the probabilities 5%, 10%, 25%, 50%, 75%, 90%, 95% and the mean
#' are used to compute the corresponding quantiles.
-#' @param xvect a numerical vector
-#' @return a numeric vector that represents the sample quantiles
+#' @param x a character string, the name of a numeric or integer vector
+#' @return a numeric vector that represents the sample quantiles
#' @export
#' @author Burton, P.; Gaye, A.
-#'
-quantileMeanDS <- function (xvect) {
-
+#'
+quantileMeanDS <- function (x) {
+
+ xvect <- .loadServersideObject(x)
+ .checkClass(obj = xvect, obj_name = x, permitted_classes = c("numeric", "integer"))
+
# check if the input vector is valid (i.e. meets DataSHIELD criteria)
check <- isValidDS(xvect)
-
+
if(check){
- # if the input vector is valid
+ # if the input vector is valid
qq <- stats::quantile(xvect,c(0.05,0.1,0.25,0.5,0.75,0.9,0.95), na.rm=TRUE)
mm <- mean(xvect,na.rm=TRUE)
quantile.obj <- c(qq, mm)
diff --git a/R/skewnessDS1.R b/R/skewnessDS1.R
index 19f95dfc..41b5b98e 100644
--- a/R/skewnessDS1.R
+++ b/R/skewnessDS1.R
@@ -19,8 +19,9 @@ skewnessDS1 <- function(x, method){
nfilter.tab <- as.numeric(thr$nfilter.tab)
#############################################################
- x <- eval(parse(text=x), envir = parent.frame())
- x <- x[stats::complete.cases(x)]
+ x.val <- .loadServersideObject(x)
+ .checkClass(obj = x.val, obj_name = x, permitted_classes = c("numeric", "integer"))
+ x <- x.val[stats::complete.cases(x.val)]
if(length(x) < nfilter.tab){
skewness.out <- NA
diff --git a/R/skewnessDS2.R b/R/skewnessDS2.R
index 8d1cb484..3d7224ef 100644
--- a/R/skewnessDS2.R
+++ b/R/skewnessDS2.R
@@ -23,8 +23,9 @@ skewnessDS2 <- function(x, global.mean){
nfilter.tab <- as.numeric(thr$nfilter.tab)
#############################################################
- x <- eval(parse(text=x), envir = parent.frame())
- x <- x[stats::complete.cases(x)]
+ x.val <- .loadServersideObject(x)
+ .checkClass(obj = x.val, obj_name = x, permitted_classes = c("numeric", "integer"))
+ x <- x.val[stats::complete.cases(x.val)]
if(length(x) < nfilter.tab){
sum_cubes.out <- NA
diff --git a/R/varDS.R b/R/varDS.R
index 390a9589..c508ba40 100644
--- a/R/varDS.R
+++ b/R/varDS.R
@@ -3,7 +3,7 @@
#' @description Calculates the variance.
#' @details if the length of input vector is less than the set filter
#' a missing value is returned.
-#' @param xvect a vector
+#' @param x a character string, the name of a numeric or integer vector
#' @return a list, with the sum of the input variable, the sum of squares of the input variable,
#' the number of missing values, the number of valid values, the number of total length of the
#' variable, and a study message indicating whether the number of valid is less than the
@@ -11,7 +11,7 @@
#' @author Amadou Gaye, Demetris Avraam, for DataSHIELD Development Team
#' @export
#'
-varDS <- function(xvect){
+varDS <- function(x){
#############################################################
# MODULE 1: CAPTURE THE nfilter SETTINGS
@@ -22,6 +22,9 @@ varDS <- function(xvect){
#nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
+ xvect <- .loadServersideObject(x)
+ .checkClass(obj = xvect, obj_name = x, permitted_classes = c("numeric", "integer"))
+
out.sum <- sum(xvect, na.rm=TRUE)
out.sumSquares <- sum(xvect^2, na.rm=TRUE)
out.numNa <- length(which(is.na(xvect)))
From 073bedc21bf6ddccfddb3916220e938c0ebaf9ca Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Sat, 11 Apr 2026 12:43:28 +0200
Subject: [PATCH 30/58] test: update unit tests
---
tests/testthat/test-smk-corDS.R | 10 ++++
tests/testthat/test-smk-corTestDS.R | 10 ++++
tests/testthat/test-smk-covDS.R | 10 ++++
tests/testthat/test-smk-kurtosisDS1.R | 9 ++++
tests/testthat/test-smk-kurtosisDS2.R | 9 ++++
tests/testthat/test-smk-meanDS.R | 15 ++++--
tests/testthat/test-smk-meanSdGpDS.R | 62 ++++++++++++++++++++++++
tests/testthat/test-smk-quantileMeanDS.R | 13 ++++-
tests/testthat/test-smk-skewnessDS1.R | 9 ++++
tests/testthat/test-smk-skewnessDS2.R | 9 ++++
tests/testthat/test-smk-varDS.R | 15 ++++--
11 files changed, 163 insertions(+), 8 deletions(-)
create mode 100644 tests/testthat/test-smk-meanSdGpDS.R
diff --git a/tests/testthat/test-smk-corDS.R b/tests/testthat/test-smk-corDS.R
index bdc3607c..034a4b00 100644
--- a/tests/testthat/test-smk-corDS.R
+++ b/tests/testthat/test-smk-corDS.R
@@ -718,6 +718,16 @@ test_that("simple corDS, casewise, some", {
expect_equal(res$sums.of.squares[4], 58.0)
})
+test_that("corDS throws error when object does not exist", {
+ expect_error(corDS("nonexistent_x", "nonexistent_y"), regexp = "does not exist")
+})
+
+test_that("corDS throws error when object is of invalid type", {
+ bad_input <- list(a = 1:3, b = 4:6)
+ y <- c(1.0, 2.0, 3.0)
+ expect_error(corDS("bad_input", "y"), regexp = "must be of type")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R
index b500a085..2dbee274 100644
--- a/tests/testthat/test-smk-corTestDS.R
+++ b/tests/testthat/test-smk-corTestDS.R
@@ -602,6 +602,16 @@ test_that("simple corTestDS, some, with na, spearman", {
expect_equal(res$`Correlation test`$data.name[[1]], "x.var and y.var")
})
+test_that("corTestDS throws error when object does not exist", {
+ expect_error(corTestDS("nonexistent_x", "nonexistent_y", "pearson", NULL, 0.95), regexp = "does not exist")
+})
+
+test_that("corTestDS throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ y <- c(1.0, 2.0, 3.0)
+ expect_error(corTestDS("bad_input", "y", "pearson", NULL, 0.95), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-covDS.R b/tests/testthat/test-smk-covDS.R
index ce731938..64710a72 100644
--- a/tests/testthat/test-smk-covDS.R
+++ b/tests/testthat/test-smk-covDS.R
@@ -232,6 +232,16 @@ test_that("numeric covDS, pairwise.complete", {
expect_true(is.na(res$errorMessage))
})
+test_that("covDS throws error when object does not exist", {
+ expect_error(covDS("nonexistent_x", "nonexistent_y", "pairwise.complete"), regexp = "does not exist")
+})
+
+test_that("covDS throws error when object is of invalid type", {
+ bad_input <- list(a = 1:3, b = 4:6)
+ y <- c(1.0, 2.0, 3.0)
+ expect_error(covDS("bad_input", "y", "pairwise.complete"), regexp = "must be of type")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-kurtosisDS1.R b/tests/testthat/test-smk-kurtosisDS1.R
index fe939107..53d9e277 100644
--- a/tests/testthat/test-smk-kurtosisDS1.R
+++ b/tests/testthat/test-smk-kurtosisDS1.R
@@ -69,6 +69,15 @@ test_that("simple kurtosisDS1, method 3", {
expect_equal(res$ValidityMessage, "VALID ANALYSIS")
})
+test_that("kurtosisDS1 throws error when object does not exist", {
+ expect_error(kurtosisDS1("nonexistent_object", 1), regexp = "does not exist")
+})
+
+test_that("kurtosisDS1 throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(kurtosisDS1("bad_input", 1), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-kurtosisDS2.R b/tests/testthat/test-smk-kurtosisDS2.R
index 8f122a6e..f481b08f 100644
--- a/tests/testthat/test-smk-kurtosisDS2.R
+++ b/tests/testthat/test-smk-kurtosisDS2.R
@@ -40,6 +40,15 @@ test_that("simple kurtosisDS2", {
expect_equal(res$ValidityMessage, "VALID ANALYSIS")
})
+test_that("kurtosisDS2 throws error when object does not exist", {
+ expect_error(kurtosisDS2("nonexistent_object", 2.5), regexp = "does not exist")
+})
+
+test_that("kurtosisDS2 throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(kurtosisDS2("bad_input", 2.5), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-meanDS.R b/tests/testthat/test-smk-meanDS.R
index e6d81a73..707218f9 100644
--- a/tests/testthat/test-smk-meanDS.R
+++ b/tests/testthat/test-smk-meanDS.R
@@ -25,7 +25,7 @@ set.standard.disclosure.settings()
test_that("numeric meanDS", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- res <- meanDS(input)
+ res <- meanDS("input")
expect_length(res, 5)
expect_equal(class(res), "list")
@@ -45,7 +45,7 @@ test_that("numeric meanDS", {
test_that("numeric meanDS, with NA", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- res <- meanDS(input)
+ res <- meanDS("input")
expect_length(res, 5)
expect_equal(class(res), "list")
@@ -65,7 +65,7 @@ test_that("numeric meanDS, with NA", {
test_that("numeric meanDS, with all NA", {
input <- c(NA, NA, NA, NA, NA)
- res <- meanDS(input)
+ res <- meanDS("input")
expect_length(res, 5)
expect_equal(class(res), "list")
@@ -81,6 +81,15 @@ test_that("numeric meanDS, with all NA", {
expect_equal(res$ValidityMessage, "VALID ANALYSIS")
})
+test_that("meanDS throws error when object does not exist", {
+ expect_error(meanDS("nonexistent_object"), regexp = "does not exist")
+})
+
+test_that("meanDS throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(meanDS("bad_input"), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-meanSdGpDS.R b/tests/testthat/test-smk-meanSdGpDS.R
new file mode 100644
index 00000000..44a00ee2
--- /dev/null
+++ b/tests/testthat/test-smk-meanSdGpDS.R
@@ -0,0 +1,62 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2019-2022 University of Newcastle upon Tyne. All rights reserved.
+# Copyright (c) 2022-2025 Arjuna Technologies, Newcastle upon Tyne. All rights reserved.
+#
+# This program and the accompanying materials
+# are made available under the terms of the GNU Public License v3.0.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#-------------------------------------------------------------------------------
+
+#
+# Set up
+#
+
+# context("meanSdGpDS::smk::setup")
+
+set.standard.disclosure.settings()
+
+#
+# Tests
+#
+
+# context("meanSdGpDS::smk::numeric by factor")
+test_that("simple meanSdGpDS, numeric by factor", {
+ x_var <- c(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0)
+ index_var <- as.factor(c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"))
+
+ res <- meanSdGpDS("x_var", "index_var")
+
+ expect_equal(class(res), "list")
+ expect_true(res$Table_valid)
+ expect_equal(res$Nvalid, 10)
+ expect_equal(res$Nmissing, 0)
+ expect_equal(res$Ntotal, 10)
+ expect_equal(res$Mean_gp[["A"]], 3.0)
+ expect_equal(res$Mean_gp[["B"]], 8.0)
+})
+
+test_that("meanSdGpDS throws error when X does not exist", {
+ index_var <- as.factor(c("A", "A", "B", "B"))
+ expect_error(meanSdGpDS("nonexistent_x", "index_var"), regexp = "does not exist")
+})
+
+test_that("meanSdGpDS throws error when INDEX does not exist", {
+ x_var <- c(1.0, 2.0, 3.0, 4.0)
+ expect_error(meanSdGpDS("x_var", "nonexistent_index"), regexp = "does not exist")
+})
+
+test_that("meanSdGpDS throws error when X is not numeric or integer", {
+ bad_x <- c("a", "b", "c", "d")
+ index_var <- as.factor(c("A", "A", "B", "B"))
+ expect_error(meanSdGpDS("bad_x", "index_var"), regexp = "must be of type numeric or integer")
+})
+
+#
+# Done
+#
+
+# context("meanSdGpDS::smk::shutdown")
+
+# context("meanSdGpDS::smk::done")
\ No newline at end of file
diff --git a/tests/testthat/test-smk-quantileMeanDS.R b/tests/testthat/test-smk-quantileMeanDS.R
index 33eb0c6f..f585cea3 100644
--- a/tests/testthat/test-smk-quantileMeanDS.R
+++ b/tests/testthat/test-smk-quantileMeanDS.R
@@ -23,7 +23,7 @@
test_that("numeric quantileMeanDS", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- res <- quantileMeanDS(input)
+ res <- quantileMeanDS("input")
expect_length(res, 8)
expect_equal(class(res), "numeric")
@@ -54,7 +54,7 @@ test_that("numeric quantileMeanDS", {
test_that("numeric quantileMeanDS, with NA", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- res <- quantileMeanDS(input)
+ res <- quantileMeanDS("input")
expect_length(res, 8)
expect_equal(class(res), "numeric")
@@ -81,6 +81,15 @@ test_that("numeric quantileMeanDS, with NA", {
expect_equal(res.names[[8]], "Mean")
})
+test_that("quantileMeanDS throws error when object does not exist", {
+ expect_error(quantileMeanDS("nonexistent_object"), regexp = "does not exist")
+})
+
+test_that("quantileMeanDS throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(quantileMeanDS("bad_input"), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-skewnessDS1.R b/tests/testthat/test-smk-skewnessDS1.R
index 562c3f65..48093a37 100644
--- a/tests/testthat/test-smk-skewnessDS1.R
+++ b/tests/testthat/test-smk-skewnessDS1.R
@@ -69,6 +69,15 @@ test_that("simple skewnessDS1, method 3", {
expect_equal(res$ValidityMessage, "VALID ANALYSIS")
})
+test_that("skewnessDS1 throws error when object does not exist", {
+ expect_error(skewnessDS1("nonexistent_object", 1), regexp = "does not exist")
+})
+
+test_that("skewnessDS1 throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(skewnessDS1("bad_input", 1), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-skewnessDS2.R b/tests/testthat/test-smk-skewnessDS2.R
index 9e59061d..3c32f2e8 100644
--- a/tests/testthat/test-smk-skewnessDS2.R
+++ b/tests/testthat/test-smk-skewnessDS2.R
@@ -40,6 +40,15 @@ test_that("simple skewnessDS2", {
expect_equal(res$ValidityMessage, "VALID ANALYSIS")
})
+test_that("skewnessDS2 throws error when object does not exist", {
+ expect_error(skewnessDS2("nonexistent_object", 2.5), regexp = "does not exist")
+})
+
+test_that("skewnessDS2 throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(skewnessDS2("bad_input", 2.5), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
diff --git a/tests/testthat/test-smk-varDS.R b/tests/testthat/test-smk-varDS.R
index 517b8d8f..b6049bb1 100644
--- a/tests/testthat/test-smk-varDS.R
+++ b/tests/testthat/test-smk-varDS.R
@@ -25,7 +25,7 @@ set.standard.disclosure.settings()
test_that("numeric varDS", {
input <- c(0.0, 1.0, 2.0, 3.0, 4.0)
- res <- varDS(input)
+ res <- varDS("input")
expect_length(res, 6)
expect_equal(class(res), "list")
@@ -47,7 +47,7 @@ test_that("numeric varDS", {
test_that("numeric varDS, with NA", {
input <- c(0.0, NA, 2.0, NA, 4.0)
- res <- varDS(input)
+ res <- varDS("input")
expect_length(res, 6)
expect_equal(class(res), "list")
@@ -69,7 +69,7 @@ test_that("numeric varDS, with NA", {
test_that("numeric varDS, with all NA", {
input <- c(NA, NA, NA, NA, NA)
- res <- varDS(input)
+ res <- varDS("input")
expect_length(res, 6)
expect_equal(class(res), "list")
@@ -87,6 +87,15 @@ test_that("numeric varDS, with all NA", {
expect_equal(res$ValidityMessage, "VALID ANALYSIS")
})
+test_that("varDS throws error when object does not exist", {
+ expect_error(varDS("nonexistent_object"), regexp = "does not exist")
+})
+
+test_that("varDS throws error when object is not numeric or integer", {
+ bad_input <- c("a", "b", "c")
+ expect_error(varDS("bad_input"), regexp = "must be of type numeric or integer")
+})
+
#
# Done
#
From 7870e5b2d8b9630ef608bd5b0aec544134e3930f Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Sat, 11 Apr 2026 13:20:57 +0200
Subject: [PATCH 31/58] fixed unit tests
---
tests/testthat/test-disc-meanDS.R | 2 +-
tests/testthat/test-disc-varDS.R | 2 +-
tests/testthat/test-perf-meanDS.R | 4 ++--
tests/testthat/test-perf-varDS.R | 4 ++--
tests/testthat/test-smk-meanDS.R | 4 ++--
tests/testthat/test-smk-meanSdGpDS.R | 4 ++--
tests/testthat/test-smk-varDS.R | 8 ++++----
7 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/tests/testthat/test-disc-meanDS.R b/tests/testthat/test-disc-meanDS.R
index 22864733..41e3d9f9 100644
--- a/tests/testthat/test-disc-meanDS.R
+++ b/tests/testthat/test-disc-meanDS.R
@@ -25,7 +25,7 @@ set.standard.disclosure.settings()
test_that("numeric meanDS, with below nfilter.tab values", {
input <- c(NA, NA, 2.0, NA, 4.0)
- expect_error(meanDS(input), "FAILED: Nvalid less than nfilter.tab", fixed = TRUE)
+ expect_error(meanDS("input"), "FAILED: Nvalid less than nfilter.tab", fixed = TRUE)
})
#
diff --git a/tests/testthat/test-disc-varDS.R b/tests/testthat/test-disc-varDS.R
index 3b60a771..28c8983d 100644
--- a/tests/testthat/test-disc-varDS.R
+++ b/tests/testthat/test-disc-varDS.R
@@ -25,7 +25,7 @@ set.standard.disclosure.settings()
test_that("numeric varDS, with below nfilter.tab values", {
input <- c(NA, NA, 2.0, NA, 4.0)
- expect_error(varDS(input), "FAILED: Nvalid less than nfilter.tab", fixed = TRUE)
+ expect_error(varDS("input"), "FAILED: Nvalid less than nfilter.tab", fixed = TRUE)
})
#
diff --git a/tests/testthat/test-perf-meanDS.R b/tests/testthat/test-perf-meanDS.R
index 59266cb2..648ff3d3 100644
--- a/tests/testthat/test-perf-meanDS.R
+++ b/tests/testthat/test-perf-meanDS.R
@@ -36,7 +36,7 @@ test_that("numeric meanDS - performance", {
.current.time <- .start.time
while (difftime(.current.time, .start.time, units = "secs")[[1]] < .durationSec) {
- meanDS(input)
+ meanDS("input")
.count <- .count + 1
.current.time <- Sys.time()
@@ -71,7 +71,7 @@ test_that("numeric meanDS, with NA - performance", {
.current.time <- .start.time
while (difftime(.current.time, .start.time, units = "secs")[[1]] < .durationSec) {
- meanDS(input)
+ meanDS("input")
.count <- .count + 1
.current.time <- Sys.time()
diff --git a/tests/testthat/test-perf-varDS.R b/tests/testthat/test-perf-varDS.R
index 10fff94a..7abe84f6 100644
--- a/tests/testthat/test-perf-varDS.R
+++ b/tests/testthat/test-perf-varDS.R
@@ -36,7 +36,7 @@ test_that("numeric varDS - performance", {
.current.time <- .start.time
while (difftime(.current.time, .start.time, units = "secs")[[1]] < .durationSec) {
- varDS(input)
+ varDS("input")
.count <- .count + 1
.current.time <- Sys.time()
@@ -71,7 +71,7 @@ test_that("numeric varDS, with NA - performance", {
.current.time <- .start.time
while (difftime(.current.time, .start.time, units = "secs")[[1]] < .durationSec) {
- varDS(input)
+ varDS("input")
.count <- .count + 1
.current.time <- Sys.time()
diff --git a/tests/testthat/test-smk-meanDS.R b/tests/testthat/test-smk-meanDS.R
index 707218f9..4a11f514 100644
--- a/tests/testthat/test-smk-meanDS.R
+++ b/tests/testthat/test-smk-meanDS.R
@@ -63,8 +63,8 @@ test_that("numeric meanDS, with NA", {
# context("meanDS::smk::numeric with all NA")
test_that("numeric meanDS, with all NA", {
- input <- c(NA, NA, NA, NA, NA)
-
+ input <- rep(NA_real_, 5)
+
res <- meanDS("input")
expect_length(res, 5)
diff --git a/tests/testthat/test-smk-meanSdGpDS.R b/tests/testthat/test-smk-meanSdGpDS.R
index 44a00ee2..de3d4ecb 100644
--- a/tests/testthat/test-smk-meanSdGpDS.R
+++ b/tests/testthat/test-smk-meanSdGpDS.R
@@ -33,8 +33,8 @@ test_that("simple meanSdGpDS, numeric by factor", {
expect_equal(res$Nvalid, 10)
expect_equal(res$Nmissing, 0)
expect_equal(res$Ntotal, 10)
- expect_equal(res$Mean_gp[["A"]], 3.0)
- expect_equal(res$Mean_gp[["B"]], 8.0)
+ expect_equal(as.numeric(res$Mean_gp)[1], 3.0)
+ expect_equal(as.numeric(res$Mean_gp)[2], 8.0)
})
test_that("meanSdGpDS throws error when X does not exist", {
diff --git a/tests/testthat/test-smk-varDS.R b/tests/testthat/test-smk-varDS.R
index b6049bb1..bfe5ce2e 100644
--- a/tests/testthat/test-smk-varDS.R
+++ b/tests/testthat/test-smk-varDS.R
@@ -67,13 +67,13 @@ test_that("numeric varDS, with NA", {
# context("varDS::smk::numeric with all NA")
test_that("numeric varDS, with all NA", {
- input <- c(NA, NA, NA, NA, NA)
-
+ input <- rep(NA_real_, 5)
+
res <- varDS("input")
-
+
expect_length(res, 6)
expect_equal(class(res), "list")
- expect_equal(class(res$Sum), "integer")
+ expect_equal(class(res$Sum), "numeric")
expect_equal(res$Sum, 0)
expect_equal(class(res$SumOfSquares), "numeric")
expect_equal(res$SumOfSquares, 0)
From 3c9432e9d20fc80ed3e8eb7213aabddd7572e952 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Sat, 11 Apr 2026 13:21:09 +0200
Subject: [PATCH 32/58] updated authorship
---
R/corDS.R | 1 +
R/corTestDS.R | 1 +
R/covDS.R | 1 +
R/kurtosisDS1.R | 1 +
R/kurtosisDS2.R | 1 +
R/meanDS.R | 1 +
R/meanSdGpDS.R | 1 +
R/quantileMeanDS.R | 1 +
R/skewnessDS1.R | 1 +
R/skewnessDS2.R | 1 +
R/varDS.R | 1 +
man/corDS.Rd | 2 ++
man/corTestDS.Rd | 2 ++
man/covDS.Rd | 2 ++
man/kurtosisDS1.Rd | 2 ++
man/kurtosisDS2.Rd | 2 ++
man/meanDS.Rd | 6 ++++--
man/meanSdGpDS.Rd | 8 +++++---
man/quantileMeanDS.Rd | 6 ++++--
man/skewnessDS1.Rd | 2 ++
man/skewnessDS2.Rd | 2 ++
man/varDS.Rd | 6 ++++--
22 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/R/corDS.R b/R/corDS.R
index 0c3a84a0..dc5a3986 100644
--- a/R/corDS.R
+++ b/R/corDS.R
@@ -16,6 +16,7 @@
#' by the 'nfilter.glm'). The second disclosure control checks that none of them is dichotomous with a
#' level having fewer counts than the pre-specified 'nfilter.tab' threshold.
#' @author Paul Burton, and Demetris Avraam for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
corDS <- function(x=NULL, y=NULL){
diff --git a/R/corTestDS.R b/R/corTestDS.R
index 521cbb55..0b533e5d 100644
--- a/R/corTestDS.R
+++ b/R/corTestDS.R
@@ -13,6 +13,7 @@
#' 4 complete pairs of observations.
#' @return the results of the correlation test.
#' @author Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
corTestDS <- function(x, y, method, exact, conf.level){
diff --git a/R/covDS.R b/R/covDS.R
index 15e43830..90207905 100644
--- a/R/covDS.R
+++ b/R/covDS.R
@@ -23,6 +23,7 @@
#' counts than the pre-specified 'nfilter.tab' threshold. If any of the input variables do not pass the disclosure
#' controls then all the output values are replaced with NAs.
#' @author Amadou Gaye, Paul Burton, and Demetris Avraam for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
covDS <- function(x=NULL, y=NULL, use=NULL){
diff --git a/R/kurtosisDS1.R b/R/kurtosisDS1.R
index 435ff6e2..d3419f65 100644
--- a/R/kurtosisDS1.R
+++ b/R/kurtosisDS1.R
@@ -9,6 +9,7 @@
#' @return a list including the kurtosis of the input numeric variable, the number of valid observations and
#' the study-side validity message.
#' @author Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
kurtosisDS1 <- function (x, method){
diff --git a/R/kurtosisDS2.R b/R/kurtosisDS2.R
index 864ca5aa..791e4f52 100644
--- a/R/kurtosisDS2.R
+++ b/R/kurtosisDS2.R
@@ -13,6 +13,7 @@
#' indicating indicating a valid analysis if the number of valid observations are above the protection filter
#' nfilter.tab or invalid analysis otherwise.
#' @author Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
kurtosisDS2 <- function(x, global.mean){
diff --git a/R/meanDS.R b/R/meanDS.R
index 8e4f8998..1cfc60a2 100644
--- a/R/meanDS.R
+++ b/R/meanDS.R
@@ -6,6 +6,7 @@
#' @param x a character string, the name of a numeric or integer vector
#' @return a numeric, the statistical mean
#' @author Gaye A, Burton PR
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
meanDS <- function(x){
diff --git a/R/meanSdGpDS.R b/R/meanSdGpDS.R
index 2375250e..9d9ca432 100644
--- a/R/meanSdGpDS.R
+++ b/R/meanSdGpDS.R
@@ -8,6 +8,7 @@
#' @param index a client-side supplied character string identifying the factor across
#' which means/SDs are to be calculated
#' @author Burton PR
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#'
#' @return List with results from the group statistics
#' @export
diff --git a/R/quantileMeanDS.R b/R/quantileMeanDS.R
index 199aee81..f94e430b 100644
--- a/R/quantileMeanDS.R
+++ b/R/quantileMeanDS.R
@@ -6,6 +6,7 @@
#' @return a numeric vector that represents the sample quantiles
#' @export
#' @author Burton, P.; Gaye, A.
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#'
quantileMeanDS <- function (x) {
diff --git a/R/skewnessDS1.R b/R/skewnessDS1.R
index 41b5b98e..a52819df 100644
--- a/R/skewnessDS1.R
+++ b/R/skewnessDS1.R
@@ -9,6 +9,7 @@
#' @return a list including the skewness of the input numeric variable, the number of valid observations and
#' the study-side validity message.
#' @author Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
skewnessDS1 <- function(x, method){
diff --git a/R/skewnessDS2.R b/R/skewnessDS2.R
index 3d7224ef..d73f1791 100644
--- a/R/skewnessDS2.R
+++ b/R/skewnessDS2.R
@@ -13,6 +13,7 @@
#' indicating indicating a valid analysis if the number of valid observations are above the protection filter
#' nfilter.tab or invalid analysis otherwise.
#' @author Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
skewnessDS2 <- function(x, global.mean){
diff --git a/R/varDS.R b/R/varDS.R
index c508ba40..0e0475b4 100644
--- a/R/varDS.R
+++ b/R/varDS.R
@@ -9,6 +9,7 @@
#' variable, and a study message indicating whether the number of valid is less than the
#' disclosure threshold
#' @author Amadou Gaye, Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
varDS <- function(x){
diff --git a/man/corDS.Rd b/man/corDS.Rd
index 91e0a36d..b3b37363 100644
--- a/man/corDS.Rd
+++ b/man/corDS.Rd
@@ -32,4 +32,6 @@ variables
}
\author{
Paul Burton, and Demetris Avraam for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/corTestDS.Rd b/man/corTestDS.Rd
index 83c8ecc0..28e7ab01 100644
--- a/man/corTestDS.Rd
+++ b/man/corTestDS.Rd
@@ -32,4 +32,6 @@ The function runs a two-sided correlation test
}
\author{
Demetris Avraam, for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/covDS.Rd b/man/covDS.Rd
index 25b7d527..9600ce75 100644
--- a/man/covDS.Rd
+++ b/man/covDS.Rd
@@ -40,4 +40,6 @@ variables
}
\author{
Amadou Gaye, Paul Burton, and Demetris Avraam for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/kurtosisDS1.Rd b/man/kurtosisDS1.Rd
index a6029a3d..34098514 100644
--- a/man/kurtosisDS1.Rd
+++ b/man/kurtosisDS1.Rd
@@ -25,4 +25,6 @@ The method is specified by the argument \code{method} in the client-side \code{d
}
\author{
Demetris Avraam, for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/kurtosisDS2.Rd b/man/kurtosisDS2.Rd
index a61f16c4..9a6e1327 100644
--- a/man/kurtosisDS2.Rd
+++ b/man/kurtosisDS2.Rd
@@ -29,4 +29,6 @@ of x across all studies and the number of valid observations of the input variab
}
\author{
Demetris Avraam, for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/meanDS.Rd b/man/meanDS.Rd
index 6802ad58..251d025b 100644
--- a/man/meanDS.Rd
+++ b/man/meanDS.Rd
@@ -4,10 +4,10 @@
\alias{meanDS}
\title{Computes statistical mean of a vector}
\usage{
-meanDS(xvect)
+meanDS(x)
}
\arguments{
-\item{xvect}{a vector}
+\item{x}{a character string, the name of a numeric or integer vector}
}
\value{
a numeric, the statistical mean
@@ -21,4 +21,6 @@ a missing value is returned.
}
\author{
Gaye A, Burton PR
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/meanSdGpDS.Rd b/man/meanSdGpDS.Rd
index 0b7cc1d5..031fdb14 100644
--- a/man/meanSdGpDS.Rd
+++ b/man/meanSdGpDS.Rd
@@ -4,13 +4,13 @@
\alias{meanSdGpDS}
\title{MeanSdGpDS}
\usage{
-meanSdGpDS(X, INDEX)
+meanSdGpDS(x, index)
}
\arguments{
-\item{X}{a client-side supplied character string identifying the variable for which
+\item{x}{a client-side supplied character string identifying the variable for which
means/SDs are to be calculated}
-\item{INDEX}{a client-side supplied character string identifying the factor across
+\item{index}{a client-side supplied character string identifying the factor across
which means/SDs are to be calculated}
}
\value{
@@ -25,4 +25,6 @@ factor
}
\author{
Burton PR
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/quantileMeanDS.Rd b/man/quantileMeanDS.Rd
index 5781685d..1f453984 100644
--- a/man/quantileMeanDS.Rd
+++ b/man/quantileMeanDS.Rd
@@ -4,10 +4,10 @@
\alias{quantileMeanDS}
\title{Generates quantiles and mean information without maximum and minimum}
\usage{
-quantileMeanDS(xvect)
+quantileMeanDS(x)
}
\arguments{
-\item{xvect}{a numerical vector}
+\item{x}{a character string, the name of a numeric or integer vector}
}
\value{
a numeric vector that represents the sample quantiles
@@ -18,4 +18,6 @@ are used to compute the corresponding quantiles.
}
\author{
Burton, P.; Gaye, A.
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/skewnessDS1.Rd b/man/skewnessDS1.Rd
index 76f48fc0..fe2921d7 100644
--- a/man/skewnessDS1.Rd
+++ b/man/skewnessDS1.Rd
@@ -25,4 +25,6 @@ The method is specified by the argument \code{method} in the client-side \code{d
}
\author{
Demetris Avraam, for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/skewnessDS2.Rd b/man/skewnessDS2.Rd
index 4537f001..12646548 100644
--- a/man/skewnessDS2.Rd
+++ b/man/skewnessDS2.Rd
@@ -29,4 +29,6 @@ of x across all studies and the number of valid observations of the input variab
}
\author{
Demetris Avraam, for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/varDS.Rd b/man/varDS.Rd
index 1c485c9b..78c9b05c 100644
--- a/man/varDS.Rd
+++ b/man/varDS.Rd
@@ -4,10 +4,10 @@
\alias{varDS}
\title{Computes the variance of vector}
\usage{
-varDS(xvect)
+varDS(x)
}
\arguments{
-\item{xvect}{a vector}
+\item{x}{a character string, the name of a numeric or integer vector}
}
\value{
a list, with the sum of the input variable, the sum of squares of the input variable,
@@ -24,4 +24,6 @@ a missing value is returned.
}
\author{
Amadou Gaye, Demetris Avraam, for DataSHIELD Development Team
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
From 8c44d302457d17175b4f92f1521f87f39a3d79a5 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 12:50:17 +0200
Subject: [PATCH 33/58] refactor: return class for consistency checking, remove
ValidityMessage
---
R/corTestDS.R | 6 +++---
R/kurtosisDS1.R | 7 ++-----
R/kurtosisDS2.R | 15 ++++++---------
R/quantileMeanDS.R | 6 +++---
R/skewnessDS1.R | 5 +----
R/skewnessDS2.R | 16 ++++++----------
6 files changed, 21 insertions(+), 34 deletions(-)
diff --git a/R/corTestDS.R b/R/corTestDS.R
index 0b533e5d..547484c8 100644
--- a/R/corTestDS.R
+++ b/R/corTestDS.R
@@ -29,9 +29,9 @@ corTestDS <- function(x, y, method, exact, conf.level){
# runs a two-sided correlation test
corTest <- stats::cor.test(x=x.var, y=y.var, method=method, exact=exact, conf.level=conf.level)
- out <- list(n, corTest)
- names(out) <- c("Number of pairwise complete cases", "Correlation test")
-
+ out <- list(n, corTest, class = class(x.var))
+ names(out)[1:2] <- c("Number of pairwise complete cases", "Correlation test")
+
# return the results
return(out)
diff --git a/R/kurtosisDS1.R b/R/kurtosisDS1.R
index d3419f65..9789ae68 100644
--- a/R/kurtosisDS1.R
+++ b/R/kurtosisDS1.R
@@ -34,19 +34,16 @@ kurtosisDS1 <- function (x, method){
if(method==1){
kurtosis.out <- g2
- studysideMessage <- "VALID ANALYSIS"
}
if(method==2){
kurtosis.out <- ((length(x) + 1) * g2 + 6) * (length(x) - 1)/((length(x) - 2) * (length(x) - 3))
- studysideMessage <- "VALID ANALYSIS"
}
if(method==3){
kurtosis.out <- (g2 + 3) * (1 - 1/length(x))^2 - 3
- studysideMessage <- "VALID ANALYSIS"
}
}
-
- out.obj <- list(Kurtosis=kurtosis.out, Nvalid=length(x), ValidityMessage=studysideMessage)
+
+ out.obj <- list(Kurtosis=kurtosis.out, Nvalid=length(x), class=class(x.val))
return(out.obj)
}
diff --git a/R/kurtosisDS2.R b/R/kurtosisDS2.R
index 791e4f52..392641ed 100644
--- a/R/kurtosisDS2.R
+++ b/R/kurtosisDS2.R
@@ -29,16 +29,13 @@ kurtosisDS2 <- function(x, global.mean){
x <- x.val[stats::complete.cases(x.val)]
if(length(x) < nfilter.tab){
- sum_quartics.out <- NA
- sum_squares.out <- NA
- studysideMessage <- "FAILED: Nvalid less than nfilter.tab"
- }else{
- sum_quartics.out <- sum((x - global.mean)^4)
- sum_squares.out <- sum((x - global.mean)^2)
- studysideMessage <- "VALID ANALYSIS"
+ stop("FAILED: Nvalid less than nfilter.tab", call. = FALSE)
}
-
- out.obj <- list(Sum.quartics=sum_quartics.out, Sum.squares=sum_squares.out, Nvalid=length(x), ValidityMessage=studysideMessage)
+
+ sum_quartics.out <- sum((x - global.mean)^4)
+ sum_squares.out <- sum((x - global.mean)^2)
+
+ out.obj <- list(Sum.quartics=sum_quartics.out, Sum.squares=sum_squares.out, Nvalid=length(x), class=class(x.val))
return(out.obj)
}
diff --git a/R/quantileMeanDS.R b/R/quantileMeanDS.R
index f94e430b..26772caf 100644
--- a/R/quantileMeanDS.R
+++ b/R/quantileMeanDS.R
@@ -21,10 +21,10 @@ quantileMeanDS <- function (x) {
qq <- stats::quantile(xvect,c(0.05,0.1,0.25,0.5,0.75,0.9,0.95), na.rm=TRUE)
mm <- mean(xvect,na.rm=TRUE)
quantile.obj <- c(qq, mm)
- names(quantile.obj) <- c("5%","10%","25%","50%","75%","90%","95%","Mean")
+ names(quantile.obj) <- c("5%","10%","25%","50%","75%","90%","95%","Mean")
}else{
quantile.obj <- NA
}
-
- return(quantile.obj)
+
+ return(list(quantiles = quantile.obj, class = class(xvect)))
}
diff --git a/R/skewnessDS1.R b/R/skewnessDS1.R
index a52819df..59e13745 100644
--- a/R/skewnessDS1.R
+++ b/R/skewnessDS1.R
@@ -34,19 +34,16 @@ skewnessDS1 <- function(x, method){
if(method==1){
skewness.out <- g1
- studysideMessage <- "VALID ANALYSIS"
}
if(method==2){
skewness.out <- g1 * sqrt(length(x)*(length(x)-1))/(length(x)-2)
- studysideMessage <- "VALID ANALYSIS"
}
if(method==3){
skewness.out <- g1 * ((length(x)-1)/(length(x)))^(3/2)
- studysideMessage <- "VALID ANALYSIS"
}
}
- out.obj <- list(Skewness=skewness.out, Nvalid=length(x), ValidityMessage=studysideMessage)
+ out.obj <- list(Skewness=skewness.out, Nvalid=length(x), class=class(x.val))
return(out.obj)
}
diff --git a/R/skewnessDS2.R b/R/skewnessDS2.R
index d73f1791..dc58ae6c 100644
--- a/R/skewnessDS2.R
+++ b/R/skewnessDS2.R
@@ -29,17 +29,13 @@ skewnessDS2 <- function(x, global.mean){
x <- x.val[stats::complete.cases(x.val)]
if(length(x) < nfilter.tab){
- sum_cubes.out <- NA
- sum_squares.out <- NA
- studysideMessage <- "FAILED: Nvalid less than nfilter.tab"
- stop(studysideMessage, call. = FALSE)
- }else{
- sum_cubes.out <- sum((x - global.mean)^3)
- sum_squares.out <- sum((x - global.mean)^2)
- studysideMessage <- "VALID ANALYSIS"
+ stop("FAILED: Nvalid less than nfilter.tab", call. = FALSE)
}
-
- out.obj <- list(Sum.cubes=sum_cubes.out, Sum.squares=sum_squares.out, Nvalid=length(x), ValidityMessage=studysideMessage)
+
+ sum_cubes.out <- sum((x - global.mean)^3)
+ sum_squares.out <- sum((x - global.mean)^2)
+
+ out.obj <- list(Sum.cubes=sum_cubes.out, Sum.squares=sum_squares.out, Nvalid=length(x), class=class(x.val))
return(out.obj)
}
From cabc097f99f41d2ff1d19df18bc278febb686adf Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 12:50:28 +0200
Subject: [PATCH 34/58] chore: set privacy level to permissive, fix expDS
authorship
---
R/expDS.R | 2 +-
inst/DATASHIELD | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/R/expDS.R b/R/expDS.R
index 3c6b53c3..2ba9e5bb 100644
--- a/R/expDS.R
+++ b/R/expDS.R
@@ -15,7 +15,7 @@ expDS <- function(x) {
x.var <- .loadServersideObject(x)
.checkClass(obj = x.var, obj_name = x, permitted_classes = c("numeric", "integer"))
- out <- exp(x.var)
+out <- exp(x.var)
return(out)
}
# ASSIGN FUNCTION
diff --git a/inst/DATASHIELD b/inst/DATASHIELD
index 8753f19d..abcabf73 100644
--- a/inst/DATASHIELD
+++ b/inst/DATASHIELD
@@ -163,7 +163,7 @@ AssignMethods:
unlist=base::unlist
Options:
datashield.privacyLevel=5,
- default.datashield.privacyControlLevel="banana",
+ default.datashield.privacyControlLevel="permissive",
default.nfilter.glm=0.33,
default.nfilter.kNN=3,
default.nfilter.string=80,
From f8fffa2d2db34e1556d14d708143078e7d336c88 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 14:10:08 +0200
Subject: [PATCH 35/58] refactor: return class for consistency checking, remove
ValidityMessage
---
R/meanDS.R | 5 +----
R/meanSdGpDS.R | 10 ++++++----
R/varDS.R | 9 ++-------
3 files changed, 9 insertions(+), 15 deletions(-)
diff --git a/R/meanDS.R b/R/meanDS.R
index 1cfc60a2..4fc3269c 100644
--- a/R/meanDS.R
+++ b/R/meanDS.R
@@ -27,14 +27,11 @@ meanDS <- function(x){
out.numNa <- length(which(is.na(xvect)))
out.totN <- length(xvect)
out.validN <- out.totN-out.numNa
- studysideMessage <- "VALID ANALYSIS"
-
if((out.validN != 0) && (out.validN < nfilter.tab)){
- out.mean <- NA
stop("FAILED: Nvalid less than nfilter.tab", call. = FALSE)
}
- out.obj <- list(EstimatedMean=out.mean,Nmissing=out.numNa,Nvalid=out.validN,Ntotal=out.totN,ValidityMessage=studysideMessage)
+ out.obj <- list(EstimatedMean=out.mean,Nmissing=out.numNa,Nvalid=out.validN,Ntotal=out.totN,class=class(xvect))
return(out.obj)
}
diff --git a/R/meanSdGpDS.R b/R/meanSdGpDS.R
index 9d9ca432..eecf0dde 100644
--- a/R/meanSdGpDS.R
+++ b/R/meanSdGpDS.R
@@ -28,6 +28,8 @@ meanSdGpDS <- function (x, index){
.checkClass(obj = X, obj_name = x, permitted_classes = c("numeric", "integer"))
INDEX <- .loadServersideObject(index)
.checkClass(obj = INDEX, obj_name = index, permitted_classes = c("factor", "character", "integer"))
+ x.class <- class(X)
+ index.class <- class(INDEX)
FUN.mean <- function(x) {mean(x,na.rm=TRUE)}
FUN.var <- function(x) {stats::var(x,na.rm=TRUE)}
@@ -120,8 +122,8 @@ meanSdGpDS <- function (x, index){
{
table.valid<-TRUE
cell.count.warning<-paste0("All tables valid")
- result<-list(table.valid,ansmat.mean,ansmat.sd,ansmat.count,Nvalid,Nmissing,Ntotal,cell.count.warning)
- names(result)<-list("Table_valid","Mean_gp","StDev_gp", "N_gp","Nvalid","Nmissing","Ntotal","Message")
+ result<-list(table.valid,ansmat.mean,ansmat.sd,ansmat.count,Nvalid,Nmissing,Ntotal,cell.count.warning,x.class,index.class)
+ names(result)<-list("Table_valid","Mean_gp","StDev_gp", "N_gp","Nvalid","Nmissing","Ntotal","Message","class.x","class.index")
return(result)
}
@@ -129,8 +131,8 @@ meanSdGpDS <- function (x, index){
{
table.valid<-FALSE
cell.count.warning<-paste0("At least one group has between 1 and ", nfilter.tab-1, " observations. Please change groups")
- result<-list(table.valid,Nvalid,Nmissing,Ntotal,cell.count.warning)
- names(result)<-list("Table_valid","Nvalid","Nmissing","Ntotal","Warning")
+ result<-list(table.valid,Nvalid,Nmissing,Ntotal,cell.count.warning,x.class,index.class)
+ names(result)<-list("Table_valid","Nvalid","Nmissing","Ntotal","Warning","class.x","class.index")
return(result)
}
diff --git a/R/varDS.R b/R/varDS.R
index 0e0475b4..75a21c17 100644
--- a/R/varDS.R
+++ b/R/varDS.R
@@ -31,16 +31,11 @@ varDS <- function(x){
out.numNa <- length(which(is.na(xvect)))
out.totN <- length(xvect)
out.validN <- out.totN-out.numNa
- studysideMessage <- "VALID ANALYSIS"
-
if((out.validN != 0) && (out.validN < nfilter.tab)){
- out.sum <- NA
- out.sumSquares <- NA
- studysideMessage <- "FAILED: Nvalid less than nfilter.tab"
- stop(studysideMessage, call. = FALSE)
+ stop("FAILED: Nvalid less than nfilter.tab", call. = FALSE)
}
- out.obj <- list(Sum=out.sum,SumOfSquares=out.sumSquares,Nmissing=out.numNa,Nvalid=out.validN,Ntotal=out.totN,ValidityMessage=studysideMessage)
+ out.obj <- list(Sum=out.sum,SumOfSquares=out.sumSquares,Nmissing=out.numNa,Nvalid=out.validN,Ntotal=out.totN,class=class(xvect))
return(out.obj)
}
From e81a81b3a34634f1360e51ea5c4b83a14960fe7d Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 13 Apr 2026 14:58:01 +0200
Subject: [PATCH 36/58] fix: return class from corDS and covDS for consistency
checking
---
R/corDS.R | 2 +-
R/covDS.R | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/R/corDS.R b/R/corDS.R
index dc5a3986..fde5ad3d 100644
--- a/R/corDS.R
+++ b/R/corDS.R
@@ -169,7 +169,7 @@ corDS <- function(x=NULL, y=NULL){
}
- return(list(sums.of.products=sums.of.products, sums=sums, complete.counts=complete.counts, na.counts=na.counts, sums.of.squares=sums.of.squares))
+ return(list(sums.of.products=sums.of.products, sums=sums, complete.counts=complete.counts, na.counts=na.counts, sums.of.squares=sums.of.squares, class=class(x.val)))
}
# AGGREGATE FUNCTION
diff --git a/R/covDS.R b/R/covDS.R
index 90207905..b15b4a5a 100644
--- a/R/covDS.R
+++ b/R/covDS.R
@@ -302,7 +302,7 @@ covDS <- function(x=NULL, y=NULL, use=NULL){
}
- return(list(sums.of.products=sums.of.products, sums=sums, complete.counts=complete.counts, na.counts=na.counts, errorMessage=errorMessage))
+ return(list(sums.of.products=sums.of.products, sums=sums, complete.counts=complete.counts, na.counts=na.counts, errorMessage=errorMessage, class=class(x.val)))
}
# AGGREGATE FUNCTION
From 05f68e6aeeac06487d73d073faf4da4d490dd646 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 14:18:33 +0200
Subject: [PATCH 37/58] test: fixed test expectations
---
tests/testthat/test-smk-cDS.R | 16 +++----
tests/testthat/test-smk-corDS.R | 8 ++--
tests/testthat/test-smk-corTestDS.R | 24 +++++-----
tests/testthat/test-smk-covDS.R | 4 +-
tests/testthat/test-smk-kurtosisDS1.R | 9 ++--
tests/testthat/test-smk-kurtosisDS2.R | 3 +-
tests/testthat/test-smk-listDS.R | 5 +-
tests/testthat/test-smk-meanDS.R | 9 ++--
tests/testthat/test-smk-quantileMeanDS.R | 58 ++++++++++++++----------
tests/testthat/test-smk-skewnessDS1.R | 9 ++--
tests/testthat/test-smk-skewnessDS2.R | 3 +-
tests/testthat/test-smk-varDS.R | 9 ++--
12 files changed, 76 insertions(+), 81 deletions(-)
diff --git a/tests/testthat/test-smk-cDS.R b/tests/testthat/test-smk-cDS.R
index 0f9842fc..518d9ac5 100644
--- a/tests/testthat/test-smk-cDS.R
+++ b/tests/testthat/test-smk-cDS.R
@@ -23,9 +23,9 @@ set.standard.disclosure.settings()
# context("cDS::smk::numeric list")
test_that("numeric list cDS", {
- input <- list(a=0.0, b=1.0, c=2.0, d=3.0)
+ a <- 0.0; b <- 1.0; c <- 2.0; d <- 3.0
- res <- cDS(input)
+ res <- cDS(c("a", "b", "c", "d"))
expect_length(res, 4)
expect_equal(class(res), "numeric")
@@ -37,9 +37,9 @@ test_that("numeric list cDS", {
# context("cDS::smk::character list")
test_that("character list cDS", {
- input <- list(a="0.0", b="1.0", c="2.0", d="3.0")
+ a <- "0.0"; b <- "1.0"; c <- "2.0"; d <- "3.0"
- res <- cDS(input)
+ res <- cDS(c("a", "b", "c", "d"))
expect_length(res, 4)
expect_equal(class(res), "character")
@@ -51,9 +51,9 @@ test_that("character list cDS", {
# context("cDS::smk::numeric list small")
test_that("single numeric list small cDS", {
- input <- list(a=0, b=1)
+ a <- 0; b <- 1
- res <- cDS(input)
+ res <- cDS(c("a", "b"))
expect_length(res, 2)
expect_equal(class(res), "logical")
@@ -63,9 +63,7 @@ test_that("single numeric list small cDS", {
# context("cDS::smk::empty list")
test_that("empty list cDS", {
- input <- list()
-
- res <- cDS(input)
+ res <- cDS(character(0))
expect_length(res, 0)
expect_equal(class(res), "NULL")
diff --git a/tests/testthat/test-smk-corDS.R b/tests/testthat/test-smk-corDS.R
index 034a4b00..e86b6e2c 100644
--- a/tests/testthat/test-smk-corDS.R
+++ b/tests/testthat/test-smk-corDS.R
@@ -378,7 +378,7 @@ test_that("simple corDS, casewise, full", {
res <- corDS("x", "y")
expect_equal(class(res), "list")
- expect_length(res, 5)
+ expect_length(res, 6)
if (base::getRversion() < '4.0.0')
{
@@ -465,7 +465,7 @@ test_that("simple corDS, casewise, neg. full", {
res <- corDS("x", "y")
expect_equal(class(res), "list")
- expect_length(res, 5)
+ expect_length(res, 6)
if (base::getRversion() < '4.0.0')
{
@@ -552,7 +552,7 @@ test_that("simple corDS, casewise, some", {
res <- corDS("x", "y")
expect_equal(class(res), "list")
- expect_length(res, 5)
+ expect_length(res, 6)
if (base::getRversion() < '4.0.0')
{
@@ -640,7 +640,7 @@ test_that("simple corDS, casewise, some", {
res <- corDS("x", "y")
expect_equal(class(res), "list")
- expect_length(res, 5)
+ expect_length(res, 6)
if (base::getRversion() < '4.0.0')
{
diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R
index 2dbee274..cb54b62f 100644
--- a/tests/testthat/test-smk-corTestDS.R
+++ b/tests/testthat/test-smk-corTestDS.R
@@ -29,7 +29,7 @@ test_that("simple corTestDS, full, without na, pearson", {
res <- corTestDS("x", "y", "pearson", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -82,7 +82,7 @@ test_that("simple corTestDS, neg. full, without na, pearson", {
res <- corTestDS("x", "y", "pearson", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -135,7 +135,7 @@ test_that("simple corTestDS, some, pearson, without na, pearson", {
res <- corTestDS("x", "y", "pearson", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -189,7 +189,7 @@ test_that("simple corTestDS, some, with na, pearson", {
res <- corTestDS("x", "y", "pearson", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 3)
@@ -238,7 +238,7 @@ test_that("simple corTestDS, full, without na, kendall", {
res <- corTestDS("x", "y", "kendall", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -284,7 +284,7 @@ test_that("simple corTestDS, neg. full, without na, kendall", {
res <- corTestDS("x", "y", "kendall", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -330,7 +330,7 @@ test_that("simple corTestDS, some, kendall, without na, kendall", {
res <- corTestDS("x", "y", "kendall", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -377,7 +377,7 @@ test_that("simple corTestDS, some, with na, kendall", {
res <- corTestDS("x", "y", "kendall", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 3)
@@ -424,7 +424,7 @@ test_that("simple corTestDS, full, without na, spearman", {
res <- corTestDS("x", "y", "spearman", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -470,7 +470,7 @@ test_that("simple corTestDS, neg. full, without na, spearman", {
res <- corTestDS("x", "y", "spearman", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -516,7 +516,7 @@ test_that("simple corTestDS, some, spearman, without na, spearman", {
res <- corTestDS("x", "y", "spearman", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 8)
@@ -563,7 +563,7 @@ test_that("simple corTestDS, some, with na, spearman", {
res <- corTestDS("x", "y", "spearman", NULL, 0.95)
expect_equal(class(res), "list")
- expect_length(res, 2)
+ expect_length(res, 3)
expect_length(res$`Number of pairwise complete cases`, 1)
expect_equal(res$`Number of pairwise complete cases`, 3)
diff --git a/tests/testthat/test-smk-covDS.R b/tests/testthat/test-smk-covDS.R
index 64710a72..24352ac7 100644
--- a/tests/testthat/test-smk-covDS.R
+++ b/tests/testthat/test-smk-covDS.R
@@ -27,7 +27,7 @@ test_that("numeric covDS, casewise.complete", {
res <- covDS("input$v1", "input$v2", "casewise.complete")
- expect_length(res, 5)
+ expect_length(res, 6)
expect_equal(class(res), "list")
res.sums.of.products.class <- class(res$sums.of.products)
@@ -130,7 +130,7 @@ test_that("numeric covDS, pairwise.complete", {
res <- covDS("input$v1", "input$v2", "pairwise.complete")
- expect_length(res, 5)
+ expect_length(res, 6)
expect_equal(class(res), "list")
res.sums.of.products.class <- class(res$sums.of.products)
diff --git a/tests/testthat/test-smk-kurtosisDS1.R b/tests/testthat/test-smk-kurtosisDS1.R
index 53d9e277..3a13786d 100644
--- a/tests/testthat/test-smk-kurtosisDS1.R
+++ b/tests/testthat/test-smk-kurtosisDS1.R
@@ -33,8 +33,7 @@ test_that("simple kurtosisDS1, method 1", {
expect_equal(res$Kurtosis, -0.458210, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid,9)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("kurtosisDS1::smk::method 2")
@@ -49,8 +48,7 @@ test_that("simple kurtosisDS1, method 2", {
expect_equal(res$Kurtosis, 0.270076, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid,9)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("kurtosisDS1::smk::method 3")
@@ -65,8 +63,7 @@ test_that("simple kurtosisDS1, method 3", {
expect_equal(res$Kurtosis, -0.991672, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid,9)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
test_that("kurtosisDS1 throws error when object does not exist", {
diff --git a/tests/testthat/test-smk-kurtosisDS2.R b/tests/testthat/test-smk-kurtosisDS2.R
index f481b08f..69a735a6 100644
--- a/tests/testthat/test-smk-kurtosisDS2.R
+++ b/tests/testthat/test-smk-kurtosisDS2.R
@@ -36,8 +36,7 @@ test_that("simple kurtosisDS2", {
expect_equal(res$Sum.squares, 3.25, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
test_that("kurtosisDS2 throws error when object does not exist", {
diff --git a/tests/testthat/test-smk-listDS.R b/tests/testthat/test-smk-listDS.R
index dfd0a171..51e75550 100644
--- a/tests/testthat/test-smk-listDS.R
+++ b/tests/testthat/test-smk-listDS.R
@@ -21,10 +21,11 @@
# context("listDS::smk::simple")
test_that("simple listDS", {
- input <- list(v1 = c(1, 2, 3), v2 = c(4, 5, 6))
+ v1 <- c(1, 2, 3)
+ v2 <- c(4, 5, 6)
eltnames <- c('n1', 'n2')
- res <- listDS(input, eltnames)
+ res <- listDS(c("v1", "v2"), eltnames)
expect_equal(class(res), "list")
expect_length(res, 2)
diff --git a/tests/testthat/test-smk-meanDS.R b/tests/testthat/test-smk-meanDS.R
index 4a11f514..8bb47c69 100644
--- a/tests/testthat/test-smk-meanDS.R
+++ b/tests/testthat/test-smk-meanDS.R
@@ -37,8 +37,7 @@ test_that("numeric meanDS", {
expect_equal(res$Nvalid, 5)
expect_equal(class(res$Ntotal), "integer")
expect_equal(res$Ntotal, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("meanDS::smk::numeric with NA")
@@ -57,8 +56,7 @@ test_that("numeric meanDS, with NA", {
expect_equal(res$Nvalid, 3)
expect_equal(class(res$Ntotal), "integer")
expect_equal(res$Ntotal, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("meanDS::smk::numeric with all NA")
@@ -77,8 +75,7 @@ test_that("numeric meanDS, with all NA", {
expect_equal(res$Nvalid, 0)
expect_equal(class(res$Ntotal), "integer")
expect_equal(res$Ntotal, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
test_that("meanDS throws error when object does not exist", {
diff --git a/tests/testthat/test-smk-quantileMeanDS.R b/tests/testthat/test-smk-quantileMeanDS.R
index f585cea3..d305c8de 100644
--- a/tests/testthat/test-smk-quantileMeanDS.R
+++ b/tests/testthat/test-smk-quantileMeanDS.R
@@ -25,18 +25,23 @@ test_that("numeric quantileMeanDS", {
res <- quantileMeanDS("input")
- expect_length(res, 8)
- expect_equal(class(res), "numeric")
- expect_equal(res[[1]], 0.2)
- expect_equal(res[[2]], 0.4)
- expect_equal(res[[3]], 1.0)
- expect_equal(res[[4]], 2.0)
- expect_equal(res[[5]], 3.0)
- expect_equal(res[[6]], 3.6)
- expect_equal(res[[7]], 3.8)
- expect_equal(res[[8]], 2.0)
-
- res.names <- names(res)
+ expect_equal(class(res), "list")
+ expect_equal(res$class, "numeric")
+
+ qq <- res$quantiles
+
+ expect_length(qq, 8)
+ expect_equal(class(qq), "numeric")
+ expect_equal(qq[[1]], 0.2)
+ expect_equal(qq[[2]], 0.4)
+ expect_equal(qq[[3]], 1.0)
+ expect_equal(qq[[4]], 2.0)
+ expect_equal(qq[[5]], 3.0)
+ expect_equal(qq[[6]], 3.6)
+ expect_equal(qq[[7]], 3.8)
+ expect_equal(qq[[8]], 2.0)
+
+ res.names <- names(qq)
expect_length(res.names, 8)
expect_equal(class(res.names), "character")
@@ -56,18 +61,23 @@ test_that("numeric quantileMeanDS, with NA", {
res <- quantileMeanDS("input")
- expect_length(res, 8)
- expect_equal(class(res), "numeric")
- expect_equal(res[[1]], 0.2)
- expect_equal(res[[2]], 0.4)
- expect_equal(res[[3]], 1.0)
- expect_equal(res[[4]], 2.0)
- expect_equal(res[[5]], 3.0)
- expect_equal(res[[6]], 3.6)
- expect_equal(res[[7]], 3.8)
- expect_equal(res[[8]], 2.0)
-
- res.names <- names(res)
+ expect_equal(class(res), "list")
+ expect_equal(res$class, "numeric")
+
+ qq <- res$quantiles
+
+ expect_length(qq, 8)
+ expect_equal(class(qq), "numeric")
+ expect_equal(qq[[1]], 0.2)
+ expect_equal(qq[[2]], 0.4)
+ expect_equal(qq[[3]], 1.0)
+ expect_equal(qq[[4]], 2.0)
+ expect_equal(qq[[5]], 3.0)
+ expect_equal(qq[[6]], 3.6)
+ expect_equal(qq[[7]], 3.8)
+ expect_equal(qq[[8]], 2.0)
+
+ res.names <- names(qq)
expect_length(res.names, 8)
expect_equal(class(res.names), "character")
diff --git a/tests/testthat/test-smk-skewnessDS1.R b/tests/testthat/test-smk-skewnessDS1.R
index 48093a37..f5d3357b 100644
--- a/tests/testthat/test-smk-skewnessDS1.R
+++ b/tests/testthat/test-smk-skewnessDS1.R
@@ -33,8 +33,7 @@ test_that("simple skewnessDS1, method 1", {
expect_equal(res$Skewness, 0.443147, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid,9)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("skewnessDS1::smk::method 2")
@@ -49,8 +48,7 @@ test_that("simple skewnessDS1, method 2", {
expect_equal(res$Skewness, 0.537175, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid,9)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("skewnessDS1::smk::method 3")
@@ -65,8 +63,7 @@ test_that("simple skewnessDS1, method 3", {
expect_equal(res$Skewness, 0.3713805, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid,9)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
test_that("skewnessDS1 throws error when object does not exist", {
diff --git a/tests/testthat/test-smk-skewnessDS2.R b/tests/testthat/test-smk-skewnessDS2.R
index 3c32f2e8..9e2ccea4 100644
--- a/tests/testthat/test-smk-skewnessDS2.R
+++ b/tests/testthat/test-smk-skewnessDS2.R
@@ -36,8 +36,7 @@ test_that("simple skewnessDS2", {
expect_equal(res$Sum.squares, 3.25, tolerance = 1e-6)
expect_equal(class(res$Nvalid), "integer")
expect_equal(res$Nvalid, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
test_that("skewnessDS2 throws error when object does not exist", {
diff --git a/tests/testthat/test-smk-varDS.R b/tests/testthat/test-smk-varDS.R
index bfe5ce2e..51eac8e2 100644
--- a/tests/testthat/test-smk-varDS.R
+++ b/tests/testthat/test-smk-varDS.R
@@ -39,8 +39,7 @@ test_that("numeric varDS", {
expect_equal(res$Nvalid, 5)
expect_equal(class(res$Ntotal), "integer")
expect_equal(res$Ntotal, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("varDS::smk::numeric with NA")
@@ -61,8 +60,7 @@ test_that("numeric varDS, with NA", {
expect_equal(res$Nvalid, 3)
expect_equal(class(res$Ntotal), "integer")
expect_equal(res$Ntotal, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
# context("varDS::smk::numeric with all NA")
@@ -83,8 +81,7 @@ test_that("numeric varDS, with all NA", {
expect_equal(res$Nvalid, 0)
expect_equal(class(res$Ntotal), "integer")
expect_equal(res$Ntotal, 5)
- expect_equal(class(res$ValidityMessage), "character")
- expect_equal(res$ValidityMessage, "VALID ANALYSIS")
+ expect_equal(res$class, "numeric")
})
test_that("varDS throws error when object does not exist", {
From b8ba4805513de5d1aa590422687479e56bcdf87e Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 14:19:15 +0200
Subject: [PATCH 38/58] docs: updated docs with authorship and parameters
---
R/cDS.R | 22 ++++++++++++----------
R/lengthDS.R | 1 +
R/listDS.R | 18 +++++++++++-------
man/cDS.Rd | 6 ++++--
man/listDS.Rd | 8 +++++---
5 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/R/cDS.R b/R/cDS.R
index 0b5b96ba..dbc224b6 100644
--- a/R/cDS.R
+++ b/R/cDS.R
@@ -3,27 +3,29 @@
#' @description This function is similar to the R base function 'c'.
#' @details Unlike the R base function 'c' on vector or list of certain
#' length are allowed as output
-#' @param objs a list which contains the the objects to concatenate.
+#' @param x.names a character vector of object names to concatenate.
#' @return a vector or list
#' @author Gaye, A.
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
-#'
-cDS <- function (objs) {
-
+#'
+cDS <- function (x.names) {
+
# Check Permissive Privacy Control Level.
dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'avocado'))
-
- # this filter sets the minimum number of observations that are allowed
+
+ # this filter sets the minimum number of observations that are allowed
#############################################################
# MODULE 1: CAPTURE THE nfilter SETTINGS
thr <- dsBase::listDisclosureSettingsDS()
nfilter.tab <- as.numeric(thr$nfilter.tab)
- #nfilter.glm <- as.numeric(thr$nfilter.glm)
- #nfilter.subset <- as.numeric(thr$nfilter.subset)
- #nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
-
+
+ objs <- list()
+ for (i in seq_along(x.names)) {
+ objs[[i]] <- .loadServersideObject(x.names[i])
+ }
x <- unlist(objs)
# check if the output is valid and output accordingly
diff --git a/R/lengthDS.R b/R/lengthDS.R
index 1c793aa0..7975d7f8 100644
--- a/R/lengthDS.R
+++ b/R/lengthDS.R
@@ -1,3 +1,4 @@
+
#'
#' @title Returns the length of a vector or list
#' @description This function is similar to R function \code{length}.
diff --git a/R/listDS.R b/R/listDS.R
index 162ae8b5..88706176 100644
--- a/R/listDS.R
+++ b/R/listDS.R
@@ -3,17 +3,21 @@
#' @description this function is similar to R function 'list'
#' @details Unlike the R function 'list' it takes also a vector of characters,
#' the names of the elements in the output list.
-#' @param input a list of objects to coerce into a list
-#' @param eltnames a character list, the names of the elements in the list.
+#' @param x.names a character vector of object names to coerce into a list.
+#' @param eltnames a character vector, the names of the elements in the list.
#' @return a list
#' @author Gaye, A.
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
-#'
-listDS <-function (input=NULL, eltnames=NULL){
-
- mylist <- input
+#'
+listDS <-function (x.names=NULL, eltnames=NULL){
+
+ mylist <- list()
+ for (i in seq_along(x.names)) {
+ mylist[[i]] <- .loadServersideObject(x.names[i])
+ }
names(mylist) <- unlist(eltnames)
return(mylist)
-
+
}
\ No newline at end of file
diff --git a/man/cDS.Rd b/man/cDS.Rd
index 7b4e448a..e3da7bf2 100644
--- a/man/cDS.Rd
+++ b/man/cDS.Rd
@@ -4,10 +4,10 @@
\alias{cDS}
\title{Concatenates objects into a vector or list}
\usage{
-cDS(objs)
+cDS(x.names)
}
\arguments{
-\item{objs}{a list which contains the the objects to concatenate.}
+\item{x.names}{a character vector of object names to concatenate.}
}
\value{
a vector or list
@@ -21,4 +21,6 @@ length are allowed as output
}
\author{
Gaye, A.
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/listDS.Rd b/man/listDS.Rd
index 36b1c236..4f0401a1 100644
--- a/man/listDS.Rd
+++ b/man/listDS.Rd
@@ -4,12 +4,12 @@
\alias{listDS}
\title{Coerce objects into a list}
\usage{
-listDS(input = NULL, eltnames = NULL)
+listDS(x.names = NULL, eltnames = NULL)
}
\arguments{
-\item{input}{a list of objects to coerce into a list}
+\item{x.names}{a character vector of object names to coerce into a list.}
-\item{eltnames}{a character list, the names of the elements in the list.}
+\item{eltnames}{a character vector, the names of the elements in the list.}
}
\value{
a list
@@ -23,4 +23,6 @@ the names of the elements in the output list.
}
\author{
Gaye, A.
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
From 1ff323f41429ecb5fcb60f406c1a4bf0cfbac85a Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 14:54:12 +0200
Subject: [PATCH 39/58] revert: remove batch-4 cDS/listDS work leaked onto
batch-3
---
R/cDS.R | 22 ++++++++++------------
R/listDS.R | 18 +++++++-----------
man/cDS.Rd | 6 ++----
man/listDS.Rd | 8 +++-----
tests/testthat/test-smk-cDS.R | 16 +++++++++-------
tests/testthat/test-smk-listDS.R | 5 ++---
6 files changed, 33 insertions(+), 42 deletions(-)
diff --git a/R/cDS.R b/R/cDS.R
index dbc224b6..0b5b96ba 100644
--- a/R/cDS.R
+++ b/R/cDS.R
@@ -3,29 +3,27 @@
#' @description This function is similar to the R base function 'c'.
#' @details Unlike the R base function 'c' on vector or list of certain
#' length are allowed as output
-#' @param x.names a character vector of object names to concatenate.
+#' @param objs a list which contains the the objects to concatenate.
#' @return a vector or list
#' @author Gaye, A.
-#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
-#'
-cDS <- function (x.names) {
-
+#'
+cDS <- function (objs) {
+
# Check Permissive Privacy Control Level.
dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'avocado'))
-
- # this filter sets the minimum number of observations that are allowed
+
+ # this filter sets the minimum number of observations that are allowed
#############################################################
# MODULE 1: CAPTURE THE nfilter SETTINGS
thr <- dsBase::listDisclosureSettingsDS()
nfilter.tab <- as.numeric(thr$nfilter.tab)
+ #nfilter.glm <- as.numeric(thr$nfilter.glm)
+ #nfilter.subset <- as.numeric(thr$nfilter.subset)
+ #nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
-
- objs <- list()
- for (i in seq_along(x.names)) {
- objs[[i]] <- .loadServersideObject(x.names[i])
- }
+
x <- unlist(objs)
# check if the output is valid and output accordingly
diff --git a/R/listDS.R b/R/listDS.R
index 88706176..162ae8b5 100644
--- a/R/listDS.R
+++ b/R/listDS.R
@@ -3,21 +3,17 @@
#' @description this function is similar to R function 'list'
#' @details Unlike the R function 'list' it takes also a vector of characters,
#' the names of the elements in the output list.
-#' @param x.names a character vector of object names to coerce into a list.
-#' @param eltnames a character vector, the names of the elements in the list.
+#' @param input a list of objects to coerce into a list
+#' @param eltnames a character list, the names of the elements in the list.
#' @return a list
#' @author Gaye, A.
-#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
-#'
-listDS <-function (x.names=NULL, eltnames=NULL){
-
- mylist <- list()
- for (i in seq_along(x.names)) {
- mylist[[i]] <- .loadServersideObject(x.names[i])
- }
+#'
+listDS <-function (input=NULL, eltnames=NULL){
+
+ mylist <- input
names(mylist) <- unlist(eltnames)
return(mylist)
-
+
}
\ No newline at end of file
diff --git a/man/cDS.Rd b/man/cDS.Rd
index e3da7bf2..7b4e448a 100644
--- a/man/cDS.Rd
+++ b/man/cDS.Rd
@@ -4,10 +4,10 @@
\alias{cDS}
\title{Concatenates objects into a vector or list}
\usage{
-cDS(x.names)
+cDS(objs)
}
\arguments{
-\item{x.names}{a character vector of object names to concatenate.}
+\item{objs}{a list which contains the the objects to concatenate.}
}
\value{
a vector or list
@@ -21,6 +21,4 @@ length are allowed as output
}
\author{
Gaye, A.
-
-Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/listDS.Rd b/man/listDS.Rd
index 4f0401a1..36b1c236 100644
--- a/man/listDS.Rd
+++ b/man/listDS.Rd
@@ -4,12 +4,12 @@
\alias{listDS}
\title{Coerce objects into a list}
\usage{
-listDS(x.names = NULL, eltnames = NULL)
+listDS(input = NULL, eltnames = NULL)
}
\arguments{
-\item{x.names}{a character vector of object names to coerce into a list.}
+\item{input}{a list of objects to coerce into a list}
-\item{eltnames}{a character vector, the names of the elements in the list.}
+\item{eltnames}{a character list, the names of the elements in the list.}
}
\value{
a list
@@ -23,6 +23,4 @@ the names of the elements in the output list.
}
\author{
Gaye, A.
-
-Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/tests/testthat/test-smk-cDS.R b/tests/testthat/test-smk-cDS.R
index 518d9ac5..0f9842fc 100644
--- a/tests/testthat/test-smk-cDS.R
+++ b/tests/testthat/test-smk-cDS.R
@@ -23,9 +23,9 @@ set.standard.disclosure.settings()
# context("cDS::smk::numeric list")
test_that("numeric list cDS", {
- a <- 0.0; b <- 1.0; c <- 2.0; d <- 3.0
+ input <- list(a=0.0, b=1.0, c=2.0, d=3.0)
- res <- cDS(c("a", "b", "c", "d"))
+ res <- cDS(input)
expect_length(res, 4)
expect_equal(class(res), "numeric")
@@ -37,9 +37,9 @@ test_that("numeric list cDS", {
# context("cDS::smk::character list")
test_that("character list cDS", {
- a <- "0.0"; b <- "1.0"; c <- "2.0"; d <- "3.0"
+ input <- list(a="0.0", b="1.0", c="2.0", d="3.0")
- res <- cDS(c("a", "b", "c", "d"))
+ res <- cDS(input)
expect_length(res, 4)
expect_equal(class(res), "character")
@@ -51,9 +51,9 @@ test_that("character list cDS", {
# context("cDS::smk::numeric list small")
test_that("single numeric list small cDS", {
- a <- 0; b <- 1
+ input <- list(a=0, b=1)
- res <- cDS(c("a", "b"))
+ res <- cDS(input)
expect_length(res, 2)
expect_equal(class(res), "logical")
@@ -63,7 +63,9 @@ test_that("single numeric list small cDS", {
# context("cDS::smk::empty list")
test_that("empty list cDS", {
- res <- cDS(character(0))
+ input <- list()
+
+ res <- cDS(input)
expect_length(res, 0)
expect_equal(class(res), "NULL")
diff --git a/tests/testthat/test-smk-listDS.R b/tests/testthat/test-smk-listDS.R
index 51e75550..dfd0a171 100644
--- a/tests/testthat/test-smk-listDS.R
+++ b/tests/testthat/test-smk-listDS.R
@@ -21,11 +21,10 @@
# context("listDS::smk::simple")
test_that("simple listDS", {
- v1 <- c(1, 2, 3)
- v2 <- c(4, 5, 6)
+ input <- list(v1 = c(1, 2, 3), v2 = c(4, 5, 6))
eltnames <- c('n1', 'n2')
- res <- listDS(c("v1", "v2"), eltnames)
+ res <- listDS(input, eltnames)
expect_equal(class(res), "list")
expect_length(res, 2)
From 0b6ab1aedc402105fb03391d4cf3adae9726250f Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 18:36:55 +0200
Subject: [PATCH 40/58] fix: restore numeric-vector-requires-y guard in
cor/covDS
Server-side check preserves pre-refactor contract that was dropped
when client-side validation moved to server. Redocument levelsDS.
---
R/corDS.R | 6 +++++-
R/covDS.R | 6 +++++-
man/levelsDS.Rd | 5 ++---
3 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/R/corDS.R b/R/corDS.R
index fde5ad3d..f4e9fa23 100644
--- a/R/corDS.R
+++ b/R/corDS.R
@@ -38,7 +38,11 @@ corDS <- function(x=NULL, y=NULL){
else{
y.val <- NULL
}
-
+
+ if (is.null(y.val) && any(class(x.val) %in% c("numeric", "integer"))) {
+ stop("If x is a numeric vector, y must also be a numeric vector.", call. = FALSE)
+ }
+
# create a data frame for the variables
if (is.null(y.val)){
dataframe <- as.data.frame(x.val)
diff --git a/R/covDS.R b/R/covDS.R
index b15b4a5a..57a99ae2 100644
--- a/R/covDS.R
+++ b/R/covDS.R
@@ -47,7 +47,11 @@ covDS <- function(x=NULL, y=NULL, use=NULL){
else{
y.val <- NULL
}
-
+
+ if (is.null(y.val) && any(class(x.val) %in% c("numeric", "integer"))) {
+ stop("If x is a numeric vector, y must also be a numeric vector.", call. = FALSE)
+ }
+
# create a data frame for the variables
if (is.null(y.val)){
dataframe <- as.data.frame(x.val)
diff --git a/man/levelsDS.Rd b/man/levelsDS.Rd
index c54b7d13..4002c73c 100644
--- a/man/levelsDS.Rd
+++ b/man/levelsDS.Rd
@@ -10,9 +10,8 @@ levelsDS(x)
\item{x}{a factor vector}
}
\value{
-a list with two elements: \code{Levels} (the factor levels present
- in the vector) and \code{class} (the class of the input object, for
- client-side consistency checking)
+a list with one element: \code{Levels} (the factor levels present
+ in the vector)
}
\description{
This function is similar to R function \code{levels}.
From 103057969af3fef80fa81daa6b849d79983ac72a Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 23:36:20 +0200
Subject: [PATCH 41/58] refactor: cDS and listDS use .loadServersideObject
---
R/cDS.R | 24 +++++++++++++-----------
R/listDS.R | 17 ++++++++++-------
tests/testthat/test-smk-cDS.R | 16 +++++++---------
tests/testthat/test-smk-listDS.R | 5 +++--
4 files changed, 33 insertions(+), 29 deletions(-)
diff --git a/R/cDS.R b/R/cDS.R
index 0b5b96ba..c326cf85 100644
--- a/R/cDS.R
+++ b/R/cDS.R
@@ -3,28 +3,30 @@
#' @description This function is similar to the R base function 'c'.
#' @details Unlike the R base function 'c' on vector or list of certain
#' length are allowed as output
-#' @param objs a list which contains the the objects to concatenate.
+#' @param x.names a character vector of object names to concatenate.
#' @return a vector or list
#' @author Gaye, A.
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
-#'
-cDS <- function (objs) {
-
+#'
+cDS <- function (x.names) {
+
# Check Permissive Privacy Control Level.
dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'avocado'))
-
- # this filter sets the minimum number of observations that are allowed
+
+ # this filter sets the minimum number of observations that are allowed
#############################################################
# MODULE 1: CAPTURE THE nfilter SETTINGS
thr <- dsBase::listDisclosureSettingsDS()
nfilter.tab <- as.numeric(thr$nfilter.tab)
- #nfilter.glm <- as.numeric(thr$nfilter.glm)
- #nfilter.subset <- as.numeric(thr$nfilter.subset)
- #nfilter.string <- as.numeric(thr$nfilter.string)
#############################################################
-
- x <- unlist(objs)
+
+ objs <- list()
+ for (i in seq_along(x.names)) {
+ objs[[i]] <- .loadServersideObject(x.names[i])
+ }
+ x <- unlist(objs)
# check if the output is valid and output accordingly
if(length(x) < nfilter.tab){
diff --git a/R/listDS.R b/R/listDS.R
index 162ae8b5..a08df9b8 100644
--- a/R/listDS.R
+++ b/R/listDS.R
@@ -3,17 +3,20 @@
#' @description this function is similar to R function 'list'
#' @details Unlike the R function 'list' it takes also a vector of characters,
#' the names of the elements in the output list.
-#' @param input a list of objects to coerce into a list
-#' @param eltnames a character list, the names of the elements in the list.
+#' @param x.names a character vector of object names to coerce into a list.
+#' @param eltnames a character vector, the names of the elements in the list.
#' @return a list
#' @author Gaye, A.
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
-#'
-listDS <-function (input=NULL, eltnames=NULL){
-
- mylist <- input
+#'
+listDS <- function (x.names = NULL, eltnames = NULL) {
+
+ mylist <- list()
+ for (i in seq_along(x.names)) {
+ mylist[[i]] <- .loadServersideObject(x.names[i])
+ }
names(mylist) <- unlist(eltnames)
return(mylist)
-
}
\ No newline at end of file
diff --git a/tests/testthat/test-smk-cDS.R b/tests/testthat/test-smk-cDS.R
index 0f9842fc..518d9ac5 100644
--- a/tests/testthat/test-smk-cDS.R
+++ b/tests/testthat/test-smk-cDS.R
@@ -23,9 +23,9 @@ set.standard.disclosure.settings()
# context("cDS::smk::numeric list")
test_that("numeric list cDS", {
- input <- list(a=0.0, b=1.0, c=2.0, d=3.0)
+ a <- 0.0; b <- 1.0; c <- 2.0; d <- 3.0
- res <- cDS(input)
+ res <- cDS(c("a", "b", "c", "d"))
expect_length(res, 4)
expect_equal(class(res), "numeric")
@@ -37,9 +37,9 @@ test_that("numeric list cDS", {
# context("cDS::smk::character list")
test_that("character list cDS", {
- input <- list(a="0.0", b="1.0", c="2.0", d="3.0")
+ a <- "0.0"; b <- "1.0"; c <- "2.0"; d <- "3.0"
- res <- cDS(input)
+ res <- cDS(c("a", "b", "c", "d"))
expect_length(res, 4)
expect_equal(class(res), "character")
@@ -51,9 +51,9 @@ test_that("character list cDS", {
# context("cDS::smk::numeric list small")
test_that("single numeric list small cDS", {
- input <- list(a=0, b=1)
+ a <- 0; b <- 1
- res <- cDS(input)
+ res <- cDS(c("a", "b"))
expect_length(res, 2)
expect_equal(class(res), "logical")
@@ -63,9 +63,7 @@ test_that("single numeric list small cDS", {
# context("cDS::smk::empty list")
test_that("empty list cDS", {
- input <- list()
-
- res <- cDS(input)
+ res <- cDS(character(0))
expect_length(res, 0)
expect_equal(class(res), "NULL")
diff --git a/tests/testthat/test-smk-listDS.R b/tests/testthat/test-smk-listDS.R
index dfd0a171..51e75550 100644
--- a/tests/testthat/test-smk-listDS.R
+++ b/tests/testthat/test-smk-listDS.R
@@ -21,10 +21,11 @@
# context("listDS::smk::simple")
test_that("simple listDS", {
- input <- list(v1 = c(1, 2, 3), v2 = c(4, 5, 6))
+ v1 <- c(1, 2, 3)
+ v2 <- c(4, 5, 6)
eltnames <- c('n1', 'n2')
- res <- listDS(input, eltnames)
+ res <- listDS(c("v1", "v2"), eltnames)
expect_equal(class(res), "list")
expect_length(res, 2)
From ab54ce0f5e0a09b7a3df36df90e9be4d54d00a40 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 23:36:20 +0200
Subject: [PATCH 42/58] fix: BooleDS accepts literal scalar V2
---
R/BooleDS.R | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/R/BooleDS.R b/R/BooleDS.R
index 70c81941..b7e48490 100644
--- a/R/BooleDS.R
+++ b/R/BooleDS.R
@@ -51,7 +51,14 @@ thr <- dsBase::listDisclosureSettingsDS() #
##########CHECK NOT LONG SPECIFIED VECTOR##############
V1<-.loadServersideObject(V1.name)
-V2<-.loadServersideObject(V2.name)
+
+# V2 may be either a server-side object name or a literal scalar (e.g. "3", "-1")
+V2.numeric <- suppressWarnings(as.numeric(V2.name))
+if(!is.na(V2.numeric)){
+ V2 <- V2.numeric
+}else{
+ V2 <- .loadServersideObject(V2.name)
+}
if(is.character(V1)){
From e5b300c593bda98388c2d74ffe75b75bc6270561 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 14 Apr 2026 23:44:07 +0200
Subject: [PATCH 43/58] docs: redocument batch-4
---
man/cDS.Rd | 6 ++++--
man/listDS.Rd | 8 +++++---
man/replaceNaDS.Rd | 4 ++--
3 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/man/cDS.Rd b/man/cDS.Rd
index 7b4e448a..e3da7bf2 100644
--- a/man/cDS.Rd
+++ b/man/cDS.Rd
@@ -4,10 +4,10 @@
\alias{cDS}
\title{Concatenates objects into a vector or list}
\usage{
-cDS(objs)
+cDS(x.names)
}
\arguments{
-\item{objs}{a list which contains the the objects to concatenate.}
+\item{x.names}{a character vector of object names to concatenate.}
}
\value{
a vector or list
@@ -21,4 +21,6 @@ length are allowed as output
}
\author{
Gaye, A.
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/listDS.Rd b/man/listDS.Rd
index 36b1c236..4f0401a1 100644
--- a/man/listDS.Rd
+++ b/man/listDS.Rd
@@ -4,12 +4,12 @@
\alias{listDS}
\title{Coerce objects into a list}
\usage{
-listDS(input = NULL, eltnames = NULL)
+listDS(x.names = NULL, eltnames = NULL)
}
\arguments{
-\item{input}{a list of objects to coerce into a list}
+\item{x.names}{a character vector of object names to coerce into a list.}
-\item{eltnames}{a character list, the names of the elements in the list.}
+\item{eltnames}{a character vector, the names of the elements in the list.}
}
\value{
a list
@@ -23,4 +23,6 @@ the names of the elements in the output list.
}
\author{
Gaye, A.
+
+Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
}
diff --git a/man/replaceNaDS.Rd b/man/replaceNaDS.Rd
index e44285bc..f6e26ed2 100644
--- a/man/replaceNaDS.Rd
+++ b/man/replaceNaDS.Rd
@@ -4,10 +4,10 @@
\alias{replaceNaDS}
\title{Replaces the missing values in a vector}
\usage{
-replaceNaDS(xvect, replacements)
+replaceNaDS(x, replacements)
}
\arguments{
-\item{xvect}{a character, the name of the vector to process.}
+\item{x}{a character, the name of the vector to process.}
\item{replacements}{a vector which contains the replacement value(s), a vector one or
more values for each study.}
From 713983f30b7dcfd05cca8be3b328165be5206bdd Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Thu, 16 Apr 2026 19:47:17 +0200
Subject: [PATCH 44/58] docs: updated authorship
---
R/BooleDS.R | 1 +
R/cbindDS.R | 1 +
R/dataFrameDS.R | 1 +
R/dataFrameFillDS.R | 1 +
R/dataFrameSortDS.R | 1 +
R/dataFrameSubsetDS1.R | 1 +
R/dataFrameSubsetDS2.R | 1 +
R/mergeDS.R | 1 +
R/rbindDS.R | 1 +
R/recodeValuesDS.R | 1 +
R/repDS.R | 1 +
R/replaceNaDS.R | 1 +
R/seqDS.R | 1 +
R/unListDS.R | 1 +
14 files changed, 14 insertions(+)
diff --git a/R/BooleDS.R b/R/BooleDS.R
index b7e48490..7081e32a 100644
--- a/R/BooleDS.R
+++ b/R/BooleDS.R
@@ -21,6 +21,7 @@
#' input vector are all converted to 1 or 0 respectively.
#'
#' @author DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#'
#' @return the levels of the input variable.
#' @export
diff --git a/R/cbindDS.R b/R/cbindDS.R
index e0ad0b4c..c8717a2c 100644
--- a/R/cbindDS.R
+++ b/R/cbindDS.R
@@ -19,6 +19,7 @@
#' of \code{ds.cbind} (or default name \code{cbind.newobj})
#' which is written to the serverside. The output object is of class data.frame.
#' @author Paul Burton and Demetris Avraam for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
cbindDS <- function(x.names.transmit=NULL, colnames.transmit=NULL){
diff --git a/R/dataFrameDS.R b/R/dataFrameDS.R
index 7f45c1af..611bb1a8 100644
--- a/R/dataFrameDS.R
+++ b/R/dataFrameDS.R
@@ -35,6 +35,7 @@
#' serverside and named according to the argument of the clientside
#' function ds.dataFrame()
#' @author DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
dataFrameDS <- function(vectors=NULL, r.names=NULL, ch.rows=FALSE, ch.names=TRUE, clnames=NULL, strAsFactors=TRUE, completeCases=FALSE){
diff --git a/R/dataFrameFillDS.R b/R/dataFrameFillDS.R
index 7f8d404a..7de8d805 100644
--- a/R/dataFrameFillDS.R
+++ b/R/dataFrameFillDS.R
@@ -17,6 +17,7 @@
#' The classes supported are 'numeric', 'integer', 'character', 'factor' and 'logical'.
#' @return Nothing is returned to the client. The generated object is written to the serverside.
#' @author Demetris Avraam for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
dataFrameFillDS <- function(df.name, allNames.transmit, class.vect.transmit, levels.vec.transmit){
diff --git a/R/dataFrameSortDS.R b/R/dataFrameSortDS.R
index ec7f5e97..9801d804 100644
--- a/R/dataFrameSortDS.R
+++ b/R/dataFrameSortDS.R
@@ -30,6 +30,7 @@
#' R environment as a data.frame named according to the argument(or with
#' default name 'dataframesort.newobj') if no name is specified
#' @author Paul Burton, with critical error identification by
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' Leire Abarrategui-Martinez, for DataSHIELD Development Team, 2/4/2020
#' @export
#'
diff --git a/R/dataFrameSubsetDS1.R b/R/dataFrameSubsetDS1.R
index 1c76c1ca..5f5e0c52 100644
--- a/R/dataFrameSubsetDS1.R
+++ b/R/dataFrameSubsetDS1.R
@@ -45,6 +45,7 @@
#' In consequence, it records error messages as studysideMessages which can only be
#' retrieved using ds.message
#' @author Paul Burton
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
dataFrameSubsetDS1 <- function(df.name=NULL,V1.name=NULL,V2.name=NULL,Boolean.operator.n=NULL,keep.cols=NULL,rm.cols=NULL,keep.NAs=NULL){
diff --git a/R/dataFrameSubsetDS2.R b/R/dataFrameSubsetDS2.R
index 8a9a6ed6..ff1f2bee 100644
--- a/R/dataFrameSubsetDS2.R
+++ b/R/dataFrameSubsetDS2.R
@@ -54,6 +54,7 @@
#' without problems no studysideMessage will have been saved and ds.message("newobj")
#' will return the message: "ALL OK: there are no studysideMessage(s) on this datasource".
#' @author DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
dataFrameSubsetDS2<-function(df.name=NULL,V1.name=NULL, V2.name=NULL, Boolean.operator.n=NULL,keep.cols=NULL, rm.cols=NULL, keep.NAs=NULL){
diff --git a/R/mergeDS.R b/R/mergeDS.R
index 750cb3c9..2cc6a2c8 100644
--- a/R/mergeDS.R
+++ b/R/mergeDS.R
@@ -51,6 +51,7 @@
#' without problems no studysideMessage will have been saved and ds.message()
#' will return the message: "ALL OK: there are no studysideMessage(s) on this datasource".
#' @author Paul Burton, Demetris Avraam, for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
mergeDS <- function(x.name, y.name, by.x.names.transmit, by.y.names.transmit, all.x, all.y,
sort, suffixes.transmit, no.dups, incomparables){
diff --git a/R/rbindDS.R b/R/rbindDS.R
index 5b0f6764..131b863c 100644
--- a/R/rbindDS.R
+++ b/R/rbindDS.R
@@ -32,6 +32,7 @@
#' without problems no studysideMessage will have been saved and ds.message("")
#' will return the message: "ALL OK: there are no studysideMessage(s) on this datasource".
#' @author Paul Burton for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
rbindDS<-function(x.names.transmit=NULL,colnames.transmit=NULL){
diff --git a/R/recodeValuesDS.R b/R/recodeValuesDS.R
index 73e57279..20017d38 100644
--- a/R/recodeValuesDS.R
+++ b/R/recodeValuesDS.R
@@ -26,6 +26,7 @@
#' initially specified in calling ds.recodeValues. The output object (the required
#' recoded variable called is written to the serverside.
#' @author Paul Burton, Demetris Avraam for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
recodeValuesDS <- function(var.name.text=NULL, values2replace.text=NULL, new.values.text=NULL, missing=NULL){
diff --git a/R/repDS.R b/R/repDS.R
index f6454ea2..994d4d22 100644
--- a/R/repDS.R
+++ b/R/repDS.R
@@ -88,6 +88,7 @@
#' without problems no studysideMessage will have been saved and ds.message("newobj")
#' will return the message: "ALL OK: there are no studysideMessage(s) on this datasource".
#' @author Paul Burton for DataSHIELD Development Team, 14/10/2019
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
repDS <- function(x1.transmit, times.transmit, length.out.transmit, each.transmit,
diff --git a/R/replaceNaDS.R b/R/replaceNaDS.R
index 698fc018..62b91f99 100644
--- a/R/replaceNaDS.R
+++ b/R/replaceNaDS.R
@@ -13,6 +13,7 @@
#' more values for each study.
#' @return a new vector without missing values
#' @author Amadou Gaye, Demetris Avraam for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
replaceNaDS <- function(x, replacements){
diff --git a/R/seqDS.R b/R/seqDS.R
index e8af69aa..56113e4a 100644
--- a/R/seqDS.R
+++ b/R/seqDS.R
@@ -45,6 +45,7 @@
#' without problems no studysideMessage will have been saved and ds.message("")
#' will return the message: "ALL OK: there are no studysideMessage(s) on this datasource".
#' @author Paul Burton for DataSHIELD Development Team, 17/9/2019
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
seqDS <- function(FROM.value.char,TO.value.char,BY.value.char,LENGTH.OUT.value.char,ALONG.WITH.name)
{
diff --git a/R/unListDS.R b/R/unListDS.R
index 9b620491..be0130b1 100644
--- a/R/unListDS.R
+++ b/R/unListDS.R
@@ -31,6 +31,7 @@
#' function - one should check as far as one can
#' the nature of the output from a call to ds.unList - e.g. ds.class, ds.length etc
#' @author Amadou Gaye (2016), Paul Burton (19/09/2019) for DataSHIELD Development Team
+#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
#'
unListDS <- function(x.name) {
From c4ff5611093722230911a3da786b5a24e039c1d0 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 21 Apr 2026 12:25:53 +0200
Subject: [PATCH 45/58] feat: add server-side functions for ds.standardiseDf
---
DESCRIPTION | 5 +-
R/standardiseDfDS.R | 133 ++++++++++++++++++++++++++++++++++++++++++++
inst/DATASHIELD | 9 ++-
3 files changed, 144 insertions(+), 3 deletions(-)
create mode 100644 R/standardiseDfDS.R
diff --git a/DESCRIPTION b/DESCRIPTION
index fabf52d8..5dcee62a 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -5,7 +5,7 @@ Description: Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a
been designed to only share non disclosive summary statistics, with built in automated output
checking based on statistical disclosure control. With data sites setting the threshold values for
the automated output checks. For more details, see 'citation("dsBase")'.
-Version: 6.3.5
+Version: 6.3.6
Authors@R: c(person(given = "Paul",
family = "Burton",
role = c("aut"),
@@ -65,6 +65,9 @@ Imports:
stringr,
lme4,
dplyr,
+ tibble,
+ purrr,
+ tidyselect,
reshape2,
polycor (>= 0.8),
splines,
diff --git a/R/standardiseDfDS.R b/R/standardiseDfDS.R
new file mode 100644
index 00000000..24e3eecf
--- /dev/null
+++ b/R/standardiseDfDS.R
@@ -0,0 +1,133 @@
+#' Get the Class of All Columns in a Data Frame
+#' @param df.name A string representing the name of the data frame.
+#' @return A tibble with the class of each column in the data frame.
+#' @importFrom dplyr %>%
+#' @importFrom tibble as_tibble
+#' @importFrom purrr map
+#' @export
+getClassAllColsDS <- function(df.name){
+ dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot'))
+
+ df.name <- eval(parse(text = df.name), envir = parent.frame())
+ all_classes <- map(df.name, class) %>% as_tibble()
+ return(all_classes)
+}
+
+#' Change Class of Target Variables in a Data Frame
+#' @param df.name A string representing the name of the data frame.
+#' @param target_vars A character vector specifying the columns to be modified.
+#' @param target_class A character vector specifying the new classes for each column (1 = factor,
+#' 2 = integer, 3 = numeric, 4 = character, 5 = logical).
+#' @return A modified data frame with the specified columns converted to the target classes.
+#' @importFrom dplyr mutate across
+#' @importFrom tidyselect all_of
+#' @export
+fixClassDS <- function(df.name, target_vars, target_class) {
+ dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot'))
+
+ df <- eval(parse(text = df.name), envir = parent.frame())
+ df_transformed <- df %>%
+ mutate(
+ across(all_of(target_vars),
+ ~ .convertClass(.x, target_class[which(target_vars == cur_column())])))
+ return(df_transformed)
+}
+
+#' Convert a Vector to a Specified Class
+#' @param x The vector to be converted.
+#' @param class_name A string indicating the target class (1 = factor, 2 = integer, 3 = numeric,
+#' 4 = character, 5 = logical).
+#' @return The converted vector.
+#' @noRd
+.convertClass <- function(target_var, target_class_code) {
+ switch(target_class_code,
+ "1" = as.factor(target_var),
+ "2" = as.integer(target_var),
+ "3" = as.numeric(target_var),
+ "4" = as.character(target_var),
+ "5" = as.logical(target_var)
+ )
+}
+
+#' Add Missing Columns with NA Values
+#' @param .data A string representing the name of the data frame.
+#' @param cols A character vector specifying the columns to be added if missing.
+#' @return A modified data frame with missing columns added and filled with NA.
+#' @importFrom dplyr mutate select
+#' @importFrom tidyselect peek_vars
+#' @importFrom purrr set_names
+#' @export
+fixColsDS <- function(.data, cols) {
+ dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot'))
+
+ .data <- eval(parse(text = .data), envir = parent.frame())
+ missing <- setdiff(cols, colnames(.data))
+ out <- .data %>%
+ mutate(!!!set_names(rep(list(NA), length(missing)), missing)) %>%
+ select(sort(peek_vars()))
+ return(out)
+}
+
+#' Retrieve Factor Levels for Specific Columns
+#' @param df.name A string representing the name of the data frame.
+#' @param factor_vars A character vector specifying the factor columns.
+#' @return A list of factor levels for the specified columns.
+#' @importFrom tidyselect all_of
+#' @importFrom purrr map imap
+#' @export
+getAllLevelsDS <- function(df.name, factor_vars) {
+ dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot'))
+
+ df <- eval(parse(text = df.name), envir = parent.frame())
+ factor_vars_split <- strsplit(factor_vars, ",\\s*")[[1]]
+ levels <- purrr::map(df[factor_vars_split], base::levels)
+
+ disclosure_check <- imap(levels, function(lvls, var) {
+ .checkLevelsDisclosure(df = df, var = var, levels = lvls)
+ })
+
+ failed_vars <- names(disclosure_check)[unlist(disclosure_check)]
+
+ if(length(failed_vars) > 0) {
+ stop("Based on the value of nfilter.levels.density, these factor variables", " {", failed_vars, "} ", "have too many levels compared to the length of the variable. Please reduce the numnber of levels or change the variable type and try again")
+ } else {
+ return(levels)
+ }
+}
+
+#' Check variable levels against disclosure thresholds
+#'
+#' Internal helper function to verify whether the number of levels in a variable
+#' exceeds the allowed density threshold defined by `dsBase::listDisclosureSettingsDS()`.
+#'
+#' @param df A data frame containing the variable.
+#' @param var Character string. Name of the variable to check.
+#' @param levels Character vector. Levels of the variable.
+#'
+#' @return Logical. `TRUE` if the check fails (i.e., disclosure threshold is violated),
+#' otherwise `FALSE`.
+#'
+#' @keywords internal
+#' @noRd
+.checkLevelsDisclosure <- function(df, var, levels) {
+ thr <- dsBase::listDisclosureSettingsDS()
+ nfilter.levels.density <- as.numeric(thr$nfilter.levels.density)
+ n_levels <- length(levels)
+ length_var <- length(df[[var]])
+ fail <- (length_var * nfilter.levels.density) < n_levels
+ return(fail)
+}
+
+#' Set Factor Levels for Specific Columns in a Data Frame
+#' @param df.name A string representing the name of the data frame to modify.
+#' @param vars A character vector specifying the columns to be modified.
+#' @param levels A named list where each element contains the levels for the corresponding factor variable.
+#' @return A modified data frame with the specified columns converted to factors with the provided levels.
+#' @export
+fixLevelsDS <- function(df.name, vars, levels) {
+ dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot'))
+
+ df.name <- eval(parse(text = df.name), envir = parent.frame())
+ out <- df.name %>%
+ mutate(across(all_of(vars), ~factor(., levels = levels[[dplyr::cur_column()]])))
+}
diff --git a/inst/DATASHIELD b/inst/DATASHIELD
index 0c59f0c2..a7acb62a 100644
--- a/inst/DATASHIELD
+++ b/inst/DATASHIELD
@@ -70,7 +70,9 @@ AggregateMethods:
is.null=base::is.null,
is.numeric=base::is.numeric,
NROW=base::NROW,
- t.test=stats::t.test
+ t.test=stats::t.test,
+ getClassAllColsDS,
+ getAllLevelsDS
AssignMethods:
absDS,
asCharacterDS,
@@ -161,7 +163,10 @@ AssignMethods:
acos=base::acos,
atan=base::atan,
sum=base::sum,
- unlist=base::unlist
+ unlist=base::unlist,
+ fixClassDS,
+ fixColsDS,
+ fixLevelsDS
Options:
datashield.privacyLevel=5,
default.datashield.privacyControlLevel="banana",
From dd6133f4ad4583339d8756d93ee408383d0729ac Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Tue, 21 Apr 2026 22:08:05 +0100
Subject: [PATCH 46/58] Added libuv1-dev to deployment
---
azure-pipelines.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index e91b05ad..7eb3e47e 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -106,7 +106,7 @@ jobs:
sudo apt-get install -qq pkg-config -y
sudo apt-get install -qq libxml2-dev libcurl4-openssl-dev libssl-dev libgit2-dev libharfbuzz-dev libfribidi-dev libfontconfig1-dev -y
- sudo apt-get install -qq libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev -y
+ sudo apt-get install -qq libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev libuv1-dev -y
sudo apt-get install -qq r-base -y
sudo R -e "install.packages('devtools', dependencies=TRUE)"
sudo R -e "install.packages('RANN', dependencies=TRUE)"
From 3b7b9d43489831b158c11db20d6d97d2dbb90a79 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Wed, 22 Apr 2026 11:02:03 +0200
Subject: [PATCH 47/58] export functions
---
NAMESPACE | 15 +++++++++++++++
man/fixClassDS.Rd | 22 ++++++++++++++++++++++
man/fixColsDS.Rd | 19 +++++++++++++++++++
man/fixLevelsDS.Rd | 21 +++++++++++++++++++++
man/getAllLevelsDS.Rd | 19 +++++++++++++++++++
man/getClassAllColsDS.Rd | 17 +++++++++++++++++
6 files changed, 113 insertions(+)
create mode 100644 man/fixClassDS.Rd
create mode 100644 man/fixColsDS.Rd
create mode 100644 man/fixLevelsDS.Rd
create mode 100644 man/getAllLevelsDS.Rd
create mode 100644 man/getClassAllColsDS.Rd
diff --git a/NAMESPACE b/NAMESPACE
index e52e5d10..6793ba57 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -41,7 +41,12 @@ export(dmtC2SDS)
export(elsplineDS)
export(extractQuantilesDS1)
export(extractQuantilesDS2)
+export(fixClassDS)
+export(fixColsDS)
+export(fixLevelsDS)
export(gamlssDS)
+export(getAllLevelsDS)
+export(getClassAllColsDS)
export(getWGSRDS)
export(glmDS1)
export(glmDS2)
@@ -139,5 +144,15 @@ import(dplyr)
import(gamlss)
import(gamlss.dist)
import(mice)
+importFrom(dplyr,"%>%")
+importFrom(dplyr,across)
+importFrom(dplyr,mutate)
+importFrom(dplyr,select)
importFrom(gamlss.dist,pST3)
importFrom(gamlss.dist,qST3)
+importFrom(purrr,imap)
+importFrom(purrr,map)
+importFrom(purrr,set_names)
+importFrom(tibble,as_tibble)
+importFrom(tidyselect,all_of)
+importFrom(tidyselect,peek_vars)
diff --git a/man/fixClassDS.Rd b/man/fixClassDS.Rd
new file mode 100644
index 00000000..d7b6bf17
--- /dev/null
+++ b/man/fixClassDS.Rd
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/standardiseDfDS.R
+\name{fixClassDS}
+\alias{fixClassDS}
+\title{Change Class of Target Variables in a Data Frame}
+\usage{
+fixClassDS(df.name, target_vars, target_class)
+}
+\arguments{
+\item{df.name}{A string representing the name of the data frame.}
+
+\item{target_vars}{A character vector specifying the columns to be modified.}
+
+\item{target_class}{A character vector specifying the new classes for each column (1 = factor,
+2 = integer, 3 = numeric, 4 = character, 5 = logical).}
+}
+\value{
+A modified data frame with the specified columns converted to the target classes.
+}
+\description{
+Change Class of Target Variables in a Data Frame
+}
diff --git a/man/fixColsDS.Rd b/man/fixColsDS.Rd
new file mode 100644
index 00000000..709d9472
--- /dev/null
+++ b/man/fixColsDS.Rd
@@ -0,0 +1,19 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/standardiseDfDS.R
+\name{fixColsDS}
+\alias{fixColsDS}
+\title{Add Missing Columns with NA Values}
+\usage{
+fixColsDS(.data, cols)
+}
+\arguments{
+\item{.data}{A string representing the name of the data frame.}
+
+\item{cols}{A character vector specifying the columns to be added if missing.}
+}
+\value{
+A modified data frame with missing columns added and filled with NA.
+}
+\description{
+Add Missing Columns with NA Values
+}
diff --git a/man/fixLevelsDS.Rd b/man/fixLevelsDS.Rd
new file mode 100644
index 00000000..096757a9
--- /dev/null
+++ b/man/fixLevelsDS.Rd
@@ -0,0 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/standardiseDfDS.R
+\name{fixLevelsDS}
+\alias{fixLevelsDS}
+\title{Set Factor Levels for Specific Columns in a Data Frame}
+\usage{
+fixLevelsDS(df.name, vars, levels)
+}
+\arguments{
+\item{df.name}{A string representing the name of the data frame to modify.}
+
+\item{vars}{A character vector specifying the columns to be modified.}
+
+\item{levels}{A named list where each element contains the levels for the corresponding factor variable.}
+}
+\value{
+A modified data frame with the specified columns converted to factors with the provided levels.
+}
+\description{
+Set Factor Levels for Specific Columns in a Data Frame
+}
diff --git a/man/getAllLevelsDS.Rd b/man/getAllLevelsDS.Rd
new file mode 100644
index 00000000..e5030725
--- /dev/null
+++ b/man/getAllLevelsDS.Rd
@@ -0,0 +1,19 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/standardiseDfDS.R
+\name{getAllLevelsDS}
+\alias{getAllLevelsDS}
+\title{Retrieve Factor Levels for Specific Columns}
+\usage{
+getAllLevelsDS(df.name, factor_vars)
+}
+\arguments{
+\item{df.name}{A string representing the name of the data frame.}
+
+\item{factor_vars}{A character vector specifying the factor columns.}
+}
+\value{
+A list of factor levels for the specified columns.
+}
+\description{
+Retrieve Factor Levels for Specific Columns
+}
diff --git a/man/getClassAllColsDS.Rd b/man/getClassAllColsDS.Rd
new file mode 100644
index 00000000..cb2de0e7
--- /dev/null
+++ b/man/getClassAllColsDS.Rd
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/standardiseDfDS.R
+\name{getClassAllColsDS}
+\alias{getClassAllColsDS}
+\title{Get the Class of All Columns in a Data Frame}
+\usage{
+getClassAllColsDS(df.name)
+}
+\arguments{
+\item{df.name}{A string representing the name of the data frame.}
+}
+\value{
+A tibble with the class of each column in the data frame.
+}
+\description{
+Get the Class of All Columns in a Data Frame
+}
From d40d899d8076b750b2c6c680092811d25ac6a23f Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Wed, 22 Apr 2026 13:10:54 +0100
Subject: [PATCH 48/58] Add 'libuv1'
---
.circleci/config.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.circleci/config.yml b/.circleci/config.yml
index a59ed99d..ec6d40e9 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -22,7 +22,7 @@ jobs:
sudo apt-get install -y r-base-core cmake
- run:
command: |
- sudo apt-get install -y libxml2-dev
+ sudo apt-get install -y libxml2-dev libuv1-dev
- run:
command: |
echo "options(Ncpus=4)" >> ~/.Rprofile
From b01c92370763400703729bf9ec15f172f10635e5 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Wed, 22 Apr 2026 14:44:08 +0100
Subject: [PATCH 49/58] Updated version to 'v6.3.6-dev'
---
DESCRIPTION | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index fabf52d8..18c70ac7 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -5,7 +5,7 @@ Description: Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a
been designed to only share non disclosive summary statistics, with built in automated output
checking based on statistical disclosure control. With data sites setting the threshold values for
the automated output checks. For more details, see 'citation("dsBase")'.
-Version: 6.3.5
+Version: 6.3.6.9000
Authors@R: c(person(given = "Paul",
family = "Burton",
role = c("aut"),
From 3c649652289491c8cc6ce0941069a9d8296b84fe Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Wed, 13 May 2026 18:22:52 +0100
Subject: [PATCH 50/58] Switched to 'RoxygenNote: 8.0.0'
---
DESCRIPTION | 2 +-
man/dsBase-package.Rd | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 18c70ac7..62f41ece 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -75,6 +75,6 @@ Imports:
Suggests:
spelling,
testthat
-RoxygenNote: 7.3.3
+RoxygenNote: 8.0.0
Encoding: UTF-8
Language: en-GB
diff --git a/man/dsBase-package.Rd b/man/dsBase-package.Rd
index 725c4131..be7f5744 100644
--- a/man/dsBase-package.Rd
+++ b/man/dsBase-package.Rd
@@ -13,6 +13,7 @@ Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a software pack
Authors:
\itemize{
+ \item Stuart Wheater \email{stuart.wheater@arjuna.com} (\href{https://orcid.org/0009-0003-2419-1964}{ORCID})
\item Paul Burton (\href{https://orcid.org/0000-0001-5799-9634}{ORCID})
\item Rebecca Wilson (\href{https://orcid.org/0000-0003-2294-593X}{ORCID})
\item Olly Butters (\href{https://orcid.org/0000-0003-0354-8461}{ORCID})
From 0c8409017b8dab6f1f38abf02389270fc22efb26 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Tue, 9 Jun 2026 18:03:56 +0200
Subject: [PATCH 51/58] revert: datashield privacy level to banana
---
inst/DATASHIELD | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/inst/DATASHIELD b/inst/DATASHIELD
index abcabf73..8753f19d 100644
--- a/inst/DATASHIELD
+++ b/inst/DATASHIELD
@@ -163,7 +163,7 @@ AssignMethods:
unlist=base::unlist
Options:
datashield.privacyLevel=5,
- default.datashield.privacyControlLevel="permissive",
+ default.datashield.privacyControlLevel="banana",
default.nfilter.glm=0.33,
default.nfilter.kNN=3,
default.nfilter.string=80,
From c7825e16529a0188cc67d2c9c379c50db1828fc3 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Fri, 12 Jun 2026 10:02:35 +0200
Subject: [PATCH 52/58] chore: added files to ignore files
---
.Rbuildignore | 2 ++
.gitignore | 2 ++
2 files changed, 4 insertions(+)
diff --git a/.Rbuildignore b/.Rbuildignore
index 4b349a88..03475a99 100644
--- a/.Rbuildignore
+++ b/.Rbuildignore
@@ -13,3 +13,5 @@
^cran-comments\.md$
^pull_request_template$
PULL_REQUEST_TEMPLATE.md
+.claude
+.idea
diff --git a/.gitignore b/.gitignore
index 573f549b..f4edd3a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,5 @@
.Rproj.user
.DS_Store
.Rapp.history
+.claude
+.idea
From fde45bdea3cd21b3b9e5784a05435200208116f9 Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 22 Jun 2026 15:25:58 +0200
Subject: [PATCH 53/58] docs: removed old message about validity check
---
R/kurtosisDS1.R | 2 +-
R/kurtosisDS2.R | 5 ++---
R/meanDS.R | 4 +++-
R/quantileMeanDS.R | 4 +++-
R/skewnessDS1.R | 2 +-
R/skewnessDS2.R | 5 ++---
R/varDS.R | 4 ++--
man/kurtosisDS1.Rd | 2 +-
man/kurtosisDS2.Rd | 5 ++---
man/meanDS.Rd | 4 +++-
man/quantileMeanDS.Rd | 4 +++-
man/skewnessDS1.Rd | 2 +-
man/skewnessDS2.Rd | 5 ++---
man/varDS.Rd | 4 ++--
14 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/R/kurtosisDS1.R b/R/kurtosisDS1.R
index 9789ae68..a51caa43 100644
--- a/R/kurtosisDS1.R
+++ b/R/kurtosisDS1.R
@@ -7,7 +7,7 @@
#' @param method an integer between 1 and 3 selecting one of the algorithms for computing kurtosis
#' detailed in the headers of the client-side \code{ds.kurtosis} function.
#' @return a list including the kurtosis of the input numeric variable, the number of valid observations and
-#' the study-side validity message.
+#' \code{class}, the class of the input object for client-side consistency checking.
#' @author Demetris Avraam, for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/kurtosisDS2.R b/R/kurtosisDS2.R
index 392641ed..e7790329 100644
--- a/R/kurtosisDS2.R
+++ b/R/kurtosisDS2.R
@@ -9,9 +9,8 @@
#' @param global.mean a numeric, the combined mean of the input variable across all studies.
#' @return a list including the sum of quartic differences between the values of x and the global mean of x across
#' all studies, the sum of squared differences between the values of x and the global mean of x across all studies,
-#' the number of valid observations (i.e. the length of x after excluding missing values), and a validity message
-#' indicating indicating a valid analysis if the number of valid observations are above the protection filter
-#' nfilter.tab or invalid analysis otherwise.
+#' the number of valid observations (i.e. the length of x after excluding missing values), and \code{class},
+#' the class of the input object for client-side consistency checking.
#' @author Demetris Avraam, for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/meanDS.R b/R/meanDS.R
index 4fc3269c..576ec1b6 100644
--- a/R/meanDS.R
+++ b/R/meanDS.R
@@ -4,7 +4,9 @@
#' @details if the length of input vector is less than the set filter
#' a missing value is returned.
#' @param x a character string, the name of a numeric or integer vector
-#' @return a numeric, the statistical mean
+#' @return a list, with the estimated mean, the number of missing values, the number of
+#' valid values, the total number of values, and \code{class}, the class of the input
+#' object for client-side consistency checking
#' @author Gaye A, Burton PR
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/quantileMeanDS.R b/R/quantileMeanDS.R
index 26772caf..b6a54e91 100644
--- a/R/quantileMeanDS.R
+++ b/R/quantileMeanDS.R
@@ -3,7 +3,9 @@
#' @description the probabilities 5%, 10%, 25%, 50%, 75%, 90%, 95% and the mean
#' are used to compute the corresponding quantiles.
#' @param x a character string, the name of a numeric or integer vector
-#' @return a numeric vector that represents the sample quantiles
+#' @return a list, with \code{quantiles}, a numeric vector that represents the sample
+#' quantiles, and \code{class}, the class of the input object for client-side consistency
+#' checking
#' @export
#' @author Burton, P.; Gaye, A.
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
diff --git a/R/skewnessDS1.R b/R/skewnessDS1.R
index 59e13745..64375375 100644
--- a/R/skewnessDS1.R
+++ b/R/skewnessDS1.R
@@ -7,7 +7,7 @@
#' @param method an integer between 1 and 3 selecting one of the algorithms for computing skewness
#' detailed in the headers of the client-side \code{ds.skewness} function.
#' @return a list including the skewness of the input numeric variable, the number of valid observations and
-#' the study-side validity message.
+#' \code{class}, the class of the input object for client-side consistency checking.
#' @author Demetris Avraam, for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/skewnessDS2.R b/R/skewnessDS2.R
index dc58ae6c..aad3088d 100644
--- a/R/skewnessDS2.R
+++ b/R/skewnessDS2.R
@@ -9,9 +9,8 @@
#' @param global.mean a numeric, the combined mean of the input variable across all studies.
#' @return a list including the sum of cubed differences between the values of x and the global mean of x across
#' all studies, the sum of squared differences between the values of x and the global mean of x across all studies,
-#' the number of valid observations (i.e. the length of x after excluding missing values), and a validity message
-#' indicating indicating a valid analysis if the number of valid observations are above the protection filter
-#' nfilter.tab or invalid analysis otherwise.
+#' the number of valid observations (i.e. the length of x after excluding missing values), and \code{class},
+#' the class of the input object for client-side consistency checking.
#' @author Demetris Avraam, for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/varDS.R b/R/varDS.R
index 75a21c17..eb9fcf0e 100644
--- a/R/varDS.R
+++ b/R/varDS.R
@@ -6,8 +6,8 @@
#' @param x a character string, the name of a numeric or integer vector
#' @return a list, with the sum of the input variable, the sum of squares of the input variable,
#' the number of missing values, the number of valid values, the number of total length of the
-#' variable, and a study message indicating whether the number of valid is less than the
-#' disclosure threshold
+#' variable, and \code{class}, the class of the input object for client-side
+#' consistency checking
#' @author Amadou Gaye, Demetris Avraam, for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/man/kurtosisDS1.Rd b/man/kurtosisDS1.Rd
index 34098514..239a3a43 100644
--- a/man/kurtosisDS1.Rd
+++ b/man/kurtosisDS1.Rd
@@ -14,7 +14,7 @@ detailed in the headers of the client-side \code{ds.kurtosis} function.}
}
\value{
a list including the kurtosis of the input numeric variable, the number of valid observations and
-the study-side validity message.
+\code{class}, the class of the input object for client-side consistency checking.
}
\description{
This function calculates the kurtosis of a numeric variable for each study separately.
diff --git a/man/kurtosisDS2.Rd b/man/kurtosisDS2.Rd
index 9a6e1327..19c07f95 100644
--- a/man/kurtosisDS2.Rd
+++ b/man/kurtosisDS2.Rd
@@ -14,9 +14,8 @@ kurtosisDS2(x, global.mean)
\value{
a list including the sum of quartic differences between the values of x and the global mean of x across
all studies, the sum of squared differences between the values of x and the global mean of x across all studies,
-the number of valid observations (i.e. the length of x after excluding missing values), and a validity message
-indicating indicating a valid analysis if the number of valid observations are above the protection filter
-nfilter.tab or invalid analysis otherwise.
+the number of valid observations (i.e. the length of x after excluding missing values), and \code{class},
+the class of the input object for client-side consistency checking.
}
\description{
This function calculates summary statistics that are returned to the client-side and
diff --git a/man/meanDS.Rd b/man/meanDS.Rd
index 251d025b..c92c0d51 100644
--- a/man/meanDS.Rd
+++ b/man/meanDS.Rd
@@ -10,7 +10,9 @@ meanDS(x)
\item{x}{a character string, the name of a numeric or integer vector}
}
\value{
-a numeric, the statistical mean
+a list, with the estimated mean, the number of missing values, the number of
+valid values, the total number of values, and \code{class}, the class of the input
+object for client-side consistency checking
}
\description{
Calculates the mean value.
diff --git a/man/quantileMeanDS.Rd b/man/quantileMeanDS.Rd
index 1f453984..2126ed58 100644
--- a/man/quantileMeanDS.Rd
+++ b/man/quantileMeanDS.Rd
@@ -10,7 +10,9 @@ quantileMeanDS(x)
\item{x}{a character string, the name of a numeric or integer vector}
}
\value{
-a numeric vector that represents the sample quantiles
+a list, with \code{quantiles}, a numeric vector that represents the sample
+quantiles, and \code{class}, the class of the input object for client-side consistency
+checking
}
\description{
the probabilities 5%, 10%, 25%, 50%, 75%, 90%, 95% and the mean
diff --git a/man/skewnessDS1.Rd b/man/skewnessDS1.Rd
index fe2921d7..d042c9ee 100644
--- a/man/skewnessDS1.Rd
+++ b/man/skewnessDS1.Rd
@@ -14,7 +14,7 @@ detailed in the headers of the client-side \code{ds.skewness} function.}
}
\value{
a list including the skewness of the input numeric variable, the number of valid observations and
-the study-side validity message.
+\code{class}, the class of the input object for client-side consistency checking.
}
\description{
This function calculates the skewness of a numeric variable for each study separately.
diff --git a/man/skewnessDS2.Rd b/man/skewnessDS2.Rd
index 12646548..9b5e7b9b 100644
--- a/man/skewnessDS2.Rd
+++ b/man/skewnessDS2.Rd
@@ -14,9 +14,8 @@ skewnessDS2(x, global.mean)
\value{
a list including the sum of cubed differences between the values of x and the global mean of x across
all studies, the sum of squared differences between the values of x and the global mean of x across all studies,
-the number of valid observations (i.e. the length of x after excluding missing values), and a validity message
-indicating indicating a valid analysis if the number of valid observations are above the protection filter
-nfilter.tab or invalid analysis otherwise.
+the number of valid observations (i.e. the length of x after excluding missing values), and \code{class},
+the class of the input object for client-side consistency checking.
}
\description{
This function calculates summary statistics that are returned to the client-side and
diff --git a/man/varDS.Rd b/man/varDS.Rd
index 78c9b05c..022923be 100644
--- a/man/varDS.Rd
+++ b/man/varDS.Rd
@@ -12,8 +12,8 @@ varDS(x)
\value{
a list, with the sum of the input variable, the sum of squares of the input variable,
the number of missing values, the number of valid values, the number of total length of the
-variable, and a study message indicating whether the number of valid is less than the
-disclosure threshold
+variable, and \code{class}, the class of the input object for client-side
+consistency checking
}
\description{
Calculates the variance.
From 6d14225b1f0e02c544c788e508939335aa05b8ed Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 22 Jun 2026 15:32:13 +0200
Subject: [PATCH 54/58] revert whitespace changes
---
R/expDS.R | 2 +-
R/lengthDS.R | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/R/expDS.R b/R/expDS.R
index 2ba9e5bb..3c6b53c3 100644
--- a/R/expDS.R
+++ b/R/expDS.R
@@ -15,7 +15,7 @@ expDS <- function(x) {
x.var <- .loadServersideObject(x)
.checkClass(obj = x.var, obj_name = x, permitted_classes = c("numeric", "integer"))
-out <- exp(x.var)
+ out <- exp(x.var)
return(out)
}
# ASSIGN FUNCTION
diff --git a/R/lengthDS.R b/R/lengthDS.R
index 47df21ce..0441e67c 100644
--- a/R/lengthDS.R
+++ b/R/lengthDS.R
@@ -1,4 +1,3 @@
-
#'
#' @title Returns the length of a vector or list
#' @description This function is similar to R function \code{length}.
From b16e72920189bc2e42c17904ebfbc646815d3b8a Mon Sep 17 00:00:00 2001
From: Tim Cadman <41470917+timcadman@users.noreply.github.com>
Date: Mon, 22 Jun 2026 15:32:45 +0200
Subject: [PATCH 55/58] added class as additional returns
---
R/corDS.R | 3 ++-
R/corTestDS.R | 3 ++-
R/covDS.R | 3 ++-
man/corDS.Rd | 3 ++-
man/corTestDS.Rd | 3 ++-
man/covDS.Rd | 3 ++-
6 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/R/corDS.R b/R/corDS.R
index f4e9fa23..6133b4e0 100644
--- a/R/corDS.R
+++ b/R/corDS.R
@@ -14,7 +14,8 @@
#' sum of squares of each variable. The first disclosure control checks that the number of variables is
#' not bigger than a percentage of the individual-level records (the allowed percentage is pre-specified
#' by the 'nfilter.glm'). The second disclosure control checks that none of them is dichotomous with a
-#' level having fewer counts than the pre-specified 'nfilter.tab' threshold.
+#' level having fewer counts than the pre-specified 'nfilter.tab' threshold. The list also includes
+#' \code{class}, the class of the input object for client-side consistency checking.
#' @author Paul Burton, and Demetris Avraam for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/corTestDS.R b/R/corTestDS.R
index 547484c8..777bdce8 100644
--- a/R/corTestDS.R
+++ b/R/corTestDS.R
@@ -11,7 +11,8 @@
#' @param conf.level confidence level for the returned confidence interval. Currently
#' only used for the Pearson product moment correlation coefficient if there are at least
#' 4 complete pairs of observations.
-#' @return the results of the correlation test.
+#' @return a list with the results of the correlation test and \code{class}, the class of the
+#' input object for client-side consistency checking.
#' @author Demetris Avraam, for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/R/covDS.R b/R/covDS.R
index 57a99ae2..fe25eabd 100644
--- a/R/covDS.R
+++ b/R/covDS.R
@@ -21,7 +21,8 @@
#' of variables is not bigger than a percentage of the individual-level records (the allowed percentage is pre-specified
#' by the 'nfilter.glm'). The second disclosure control checks that none of them is dichotomous with a level having fewer
#' counts than the pre-specified 'nfilter.tab' threshold. If any of the input variables do not pass the disclosure
-#' controls then all the output values are replaced with NAs.
+#' controls then all the output values are replaced with NAs. The list also includes \code{class}, the class
+#' of the input object for client-side consistency checking.
#' @author Amadou Gaye, Paul Burton, and Demetris Avraam for DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @export
diff --git a/man/corDS.Rd b/man/corDS.Rd
index b3b37363..6a734304 100644
--- a/man/corDS.Rd
+++ b/man/corDS.Rd
@@ -20,7 +20,8 @@ separately (columnwise) and the number of missing values casewise, and a vector
sum of squares of each variable. The first disclosure control checks that the number of variables is
not bigger than a percentage of the individual-level records (the allowed percentage is pre-specified
by the 'nfilter.glm'). The second disclosure control checks that none of them is dichotomous with a
-level having fewer counts than the pre-specified 'nfilter.tab' threshold.
+level having fewer counts than the pre-specified 'nfilter.tab' threshold. The list also includes
+\code{class}, the class of the input object for client-side consistency checking.
}
\description{
This function computes the sum of each vector of variable and the sum of the products
diff --git a/man/corTestDS.Rd b/man/corTestDS.Rd
index 28e7ab01..9c6d5cd2 100644
--- a/man/corTestDS.Rd
+++ b/man/corTestDS.Rd
@@ -22,7 +22,8 @@ only used for the Pearson product moment correlation coefficient if there are at
4 complete pairs of observations.}
}
\value{
-the results of the correlation test.
+a list with the results of the correlation test and \code{class}, the class of the
+input object for client-side consistency checking.
}
\description{
This function is similar to R function \code{cor.test}.
diff --git a/man/covDS.Rd b/man/covDS.Rd
index 9600ce75..4b067a16 100644
--- a/man/covDS.Rd
+++ b/man/covDS.Rd
@@ -28,7 +28,8 @@ whether or not the input variables pass the disclosure controls. The first discl
of variables is not bigger than a percentage of the individual-level records (the allowed percentage is pre-specified
by the 'nfilter.glm'). The second disclosure control checks that none of them is dichotomous with a level having fewer
counts than the pre-specified 'nfilter.tab' threshold. If any of the input variables do not pass the disclosure
-controls then all the output values are replaced with NAs.
+controls then all the output values are replaced with NAs. The list also includes \code{class}, the class
+of the input object for client-side consistency checking.
}
\description{
This function computes the sum of each vector of variable and the sum of the products of each two
From 9692ef8e2cdf0b5fa68e6d88af38b0156b960519 Mon Sep 17 00:00:00 2001
From: Stuart Wheater
Date: Mon, 6 Jul 2026 12:55:41 +0100
Subject: [PATCH 56/58] Update to documentation
---
README.md | 4 +-
_pkgdown.yml | 1 +
docs/404.html | 98 +-
docs/404.md | 3 +
docs/LICENSE.html | 71 +-
docs/LICENSE.md | 694 +
docs/authors.html | 108 +-
docs/authors.md | 108 +
.../bootstrap-5.3.8/bootstrap.bundle.min.js | 7 +
.../bootstrap.bundle.min.js.map | 1 +
docs/deps/bootstrap-5.3.8/bootstrap.min.css | 5 +
docs/deps/bootstrap-5.3.8/font.css | 200 +
.../07d40e985ad7c747025dabb9f22142c4.woff2 | Bin 0 -> 16388 bytes
.../fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 | Bin 0 -> 48264 bytes
.../fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 | Bin 0 -> 26988 bytes
.../fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 | Bin 0 -> 11384 bytes
.../fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 | Bin 0 -> 31480 bytes
.../fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 | Bin 0 -> 25864 bytes
.../1f5e011d6aae0d98fc0518e1a303e99a.woff2 | Bin 0 -> 10308 bytes
.../fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 | Bin 0 -> 46980 bytes
.../fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 | Bin 0 -> 24472 bytes
.../fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 | Bin 0 -> 14664 bytes
.../fonts/4iCs6KVjbNBYlgoKew72j00.woff2 | Bin 0 -> 20852 bytes
.../fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 | Bin 0 -> 15068 bytes
.../fonts/4iCs6KVjbNBYlgoKfw72.woff2 | Bin 0 -> 34924 bytes
.../fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 | Bin 0 -> 13156 bytes
.../fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 | Bin 0 -> 29844 bytes
.../fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 | Bin 0 -> 18108 bytes
.../fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 | Bin 0 -> 13204 bytes
.../fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 | Bin 0 -> 20960 bytes
.../fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 | Bin 0 -> 38020 bytes
.../626330658504e338ee86aec8e957426b.woff2 | Bin 0 -> 21752 bytes
...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 | Bin 0 -> 1068 bytes
...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 | Bin 0 -> 1236 bytes
.../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 | Bin 0 -> 14180 bytes
...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 | Bin 0 -> 5836 bytes
...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 | Bin 0 -> 21796 bytes
...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 | Bin 0 -> 1068 bytes
...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 | Bin 0 -> 928 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 | Bin 0 -> 5840 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 | Bin 0 -> 6032 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 | Bin 0 -> 5036 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 | Bin 0 -> 23124 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 | Bin 0 -> 7048 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 | Bin 0 -> 14868 bytes
.../6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 | Bin 0 -> 8044 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 | Bin 0 -> 8024 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 | Bin 0 -> 7068 bytes
...6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 | Bin 0 -> 14876 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 | Bin 0 -> 5852 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 | Bin 0 -> 23112 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 | Bin 0 -> 5044 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 | Bin 0 -> 5992 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 | Bin 0 -> 7948 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 | Bin 0 -> 6944 bytes
...6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 | Bin 0 -> 14724 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 | Bin 0 -> 5824 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 | Bin 0 -> 22928 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 | Bin 0 -> 5008 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 | Bin 0 -> 5996 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 | Bin 0 -> 7876 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 | Bin 0 -> 7020 bytes
...6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 | Bin 0 -> 14792 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 | Bin 0 -> 5868 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 | Bin 0 -> 22984 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 | Bin 0 -> 5036 bytes
...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 | Bin 0 -> 6036 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNBeudwk.woff2 | Bin 0 -> 700 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 | Bin 0 -> 13436 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNdeudwk.woff2 | Bin 0 -> 628 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNheudwk.woff2 | Bin 0 -> 628 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNleudwk.woff2 | Bin 0 -> 628 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 | Bin 0 -> 12340 bytes
.../CSR54z1Qlv-GDxkbKVQ_dFsvWNteudwk.woff2 | Bin 0 -> 3112 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fO0KTet_.woff2 | Bin 0 -> 10972 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 | Bin 0 -> 20772 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fO8KTet_.woff2 | Bin 0 -> 4188 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 | Bin 0 -> 13268 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fOMKTet_.woff2 | Bin 0 -> 10020 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fOQKTet_.woff2 | Bin 0 -> 8032 bytes
.../fonts/CSR64z1Qlv-GDxkbKVQ_fOwKTet_.woff2 | Bin 0 -> 6292 bytes
..._QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 | Bin 0 -> 2384 bytes
.../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 | Bin 0 -> 22448 bytes
..._QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 | Bin 0 -> 1876 bytes
..._QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 | Bin 0 -> 1696 bytes
..._QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 | Bin 0 -> 1956 bytes
..._QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 | Bin 0 -> 34012 bytes
..._QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 | Bin 0 -> 8216 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 | Bin 0 -> 33568 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 | Bin 0 -> 8808 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 | Bin 0 -> 3096 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 | Bin 0 -> 8176 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 | Bin 0 -> 14180 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 | Bin 0 -> 22044 bytes
.../HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 | Bin 0 -> 10696 bytes
.../fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 | Bin 0 -> 23828 bytes
.../fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 | Bin 0 -> 26368 bytes
.../fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 | Bin 0 -> 12928 bytes
.../fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 | Bin 0 -> 70688 bytes
.../fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 | Bin 0 -> 37956 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 | Bin 0 -> 17624 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 | Bin 0 -> 4348 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 | Bin 0 -> 36652 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 | Bin 0 -> 29392 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 | Bin 0 -> 14340 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 | Bin 0 -> 23664 bytes
...O7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 | Bin 0 -> 43136 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 | Bin 0 -> 41348 bytes
...CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 | Bin 0 -> 20556 bytes
.../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 | Bin 0 -> 78908 bytes
.../fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 | Bin 0 -> 5776 bytes
.../fonts/S6u8w4BMUTPHjxsAXC-q.woff2 | Bin 0 -> 24408 bytes
.../fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 | Bin 0 -> 5552 bytes
.../fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 | Bin 0 -> 23040 bytes
.../fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 | Bin 0 -> 5820 bytes
.../fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 | Bin 0 -> 23236 bytes
.../fonts/S6uyw4BMUTPHjx4wXg.woff2 | Bin 0 -> 23580 bytes
.../fonts/S6uyw4BMUTPHjxAwXjeu.woff2 | Bin 0 -> 5612 bytes
...73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2 | Bin 0 -> 18748 bytes
...UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2 | Bin 0 -> 48256 bytes
...73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2 | Bin 0 -> 18996 bytes
...73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2 | Bin 0 -> 85068 bytes
...73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2 | Bin 0 -> 25960 bytes
...73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2 | Bin 0 -> 11232 bytes
...73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2 | Bin 0 -> 10252 bytes
.../fonts/XRXV3I6Li01BKofIMeaBXso.woff2 | Bin 0 -> 20776 bytes
.../fonts/XRXV3I6Li01BKofINeaB.woff2 | Bin 0 -> 39128 bytes
.../fonts/XRXV3I6Li01BKofIO-aBXso.woff2 | Bin 0 -> 35588 bytes
.../fonts/XRXV3I6Li01BKofIOOaBXso.woff2 | Bin 0 -> 28928 bytes
.../fonts/XRXV3I6Li01BKofIOuaBXso.woff2 | Bin 0 -> 13096 bytes
.../c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 | Bin 0 -> 27908 bytes
.../ee91700cdbf7ce16c054c2bb8946c736.woff2 | Bin 0 -> 31076 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 | Bin 0 -> 26368 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 | Bin 0 -> 37752 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 | Bin 0 -> 54944 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 | Bin 0 -> 4844 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 | Bin 0 -> 17212 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 | Bin 0 -> 17880 bytes
...126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 | Bin 0 -> 50216 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 | Bin 0 -> 22920 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 | Bin 0 -> 32016 bytes
...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 | Bin 0 -> 56528 bytes
...Gs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 | Bin 0 -> 48320 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 | Bin 0 -> 16920 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 | Bin 0 -> 16496 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 | Bin 0 -> 35156 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 | Bin 0 -> 49268 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 | Bin 0 -> 4504 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 | Bin 0 -> 26588 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 | Bin 0 -> 21332 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 | Bin 0 -> 26596 bytes
...126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 | Bin 0 -> 51912 bytes
.../fonts/q5uGsou0JOdh94bfuQltOxU.woff2 | Bin 0 -> 19308 bytes
.../fonts/q5uGsou0JOdh94bfvQlt.woff2 | Bin 0 -> 25376 bytes
.../bootstrap-toc-1.0.1/bootstrap-toc.min.js | 5 +
.../deps/clipboard.js-2.0.11/clipboard.min.js | 7 +
docs/deps/data-deps.txt | 13 +
docs/deps/font-awesome-6.5.2/css/all.css | 8028 ++++++++++++
docs/deps/font-awesome-6.5.2/css/all.min.css | 9 +
docs/deps/font-awesome-6.5.2/css/v4-shims.css | 2194 ++++
.../font-awesome-6.5.2/css/v4-shims.min.css | 6 +
.../webfonts/fa-brands-400.ttf | Bin 0 -> 209128 bytes
.../webfonts/fa-brands-400.woff2 | Bin 0 -> 117852 bytes
.../webfonts/fa-regular-400.ttf | Bin 0 -> 67860 bytes
.../webfonts/fa-regular-400.woff2 | Bin 0 -> 25392 bytes
.../webfonts/fa-solid-900.ttf | Bin 0 -> 420332 bytes
.../webfonts/fa-solid-900.woff2 | Bin 0 -> 156400 bytes
.../webfonts/fa-v4compatibility.ttf | Bin 0 -> 10832 bytes
.../webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4792 bytes
docs/deps/headroom-0.11.0/headroom.min.js | 7 +
.../headroom-0.11.0/jQuery.headroom.min.js | 7 +
docs/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ++++++++++++++++
docs/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 +
docs/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 +
.../search-1.0.0/autocomplete.jquery.min.js | 7 +
docs/deps/search-1.0.0/fuse.min.js | 9 +
docs/deps/search-1.0.0/mark.min.js | 7 +
docs/index.html | 104 +-
docs/index.md | 101 +
docs/katex-auto.js | 16 +
docs/lightswitch.js | 85 +
docs/llms.txt | 489 +
docs/pkgdown.js | 218 +-
docs/pkgdown.yml | 2 +-
docs/reference/BooleDS.html | 100 +-
docs/reference/BooleDS.md | 60 +
docs/reference/absDS.html | 97 +-
docs/reference/absDS.md | 30 +
docs/reference/asCharacterDS.html | 97 +-
docs/reference/asCharacterDS.md | 33 +
docs/reference/asDataMatrixDS.html | 100 +-
docs/reference/asDataMatrixDS.md | 37 +
docs/reference/asFactorDS1.html | 96 +-
docs/reference/asFactorDS1.md | 27 +
docs/reference/asFactorDS2.html | 96 +-
docs/reference/asFactorDS2.md | 51 +
docs/reference/asFactorSimpleDS.html | 96 +-
docs/reference/asFactorSimpleDS.md | 32 +
docs/reference/asIntegerDS.html | 97 +-
docs/reference/asIntegerDS.md | 34 +
docs/reference/asListDS.html | 97 +-
docs/reference/asListDS.md | 46 +
docs/reference/asLogicalDS.html | 97 +-
docs/reference/asLogicalDS.md | 32 +
docs/reference/asMatrixDS.html | 97 +-
docs/reference/asMatrixDS.md | 32 +
docs/reference/asNumericDS.html | 97 +-
docs/reference/asNumericDS.md | 34 +
docs/reference/aucDS.html | 100 +-
docs/reference/aucDS.md | 33 +
docs/reference/blackBoxDS.html | 100 +-
docs/reference/blackBoxDS.md | 81 +
docs/reference/blackBoxRanksDS.html | 102 +-
docs/reference/blackBoxRanksDS.md | 71 +
docs/reference/boxPlotGGDS.html | 94 +-
docs/reference/boxPlotGGDS.md | 41 +
.../reference/boxPlotGG_data_TreatmentDS.html | 89 +-
docs/reference/boxPlotGG_data_TreatmentDS.md | 37 +
.../boxPlotGG_data_Treatment_numericDS.html | 89 +-
.../boxPlotGG_data_Treatment_numericDS.md | 23 +
docs/reference/bp_standardsDS.html | 102 +-
docs/reference/bp_standardsDS.md | 60 +
docs/reference/cDS.html | 97 +-
docs/reference/cDS.md | 28 +
docs/reference/cbindDS.html | 101 +-
docs/reference/cbindDS.md | 45 +
docs/reference/changeRefGroupDS.html | 97 +-
docs/reference/changeRefGroupDS.md | 41 +
docs/reference/checkNegValueDS.html | 97 +-
docs/reference/checkNegValueDS.md | 31 +
.../checkPermissivePrivacyControlLevel.html | 97 +-
.../checkPermissivePrivacyControlLevel.md | 32 +
docs/reference/classDS.html | 97 +-
docs/reference/classDS.md | 27 +
docs/reference/colnamesDS.html | 97 +-
docs/reference/colnamesDS.md | 27 +
docs/reference/completeCasesDS.html | 100 +-
docs/reference/completeCasesDS.md | 54 +
docs/reference/corDS.html | 100 +-
docs/reference/corDS.md | 47 +
docs/reference/corTestDS.html | 97 +-
docs/reference/corTestDS.md | 48 +
docs/reference/covDS.html | 100 +-
docs/reference/covDS.md | 63 +
docs/reference/dataFrameDS.html | 101 +-
docs/reference/dataFrameDS.md | 87 +
docs/reference/dataFrameFillDS.html | 97 +-
docs/reference/dataFrameFillDS.md | 56 +
docs/reference/dataFrameSortDS.html | 97 +-
docs/reference/dataFrameSortDS.md | 72 +
docs/reference/dataFrameSubsetDS1.html | 97 +-
docs/reference/dataFrameSubsetDS1.md | 96 +
docs/reference/dataFrameSubsetDS2.html | 97 +-
docs/reference/dataFrameSubsetDS2.md | 106 +
docs/reference/densityGridDS.html | 97 +-
docs/reference/densityGridDS.md | 70 +
docs/reference/dimDS.html | 97 +-
docs/reference/dimDS.md | 27 +
docs/reference/dmtC2SDS.html | 100 +-
docs/reference/dmtC2SDS.md | 97 +
docs/reference/dsBase-package.html | 84 +-
docs/reference/dsBase-package.md | 45 +
docs/reference/elsplineDS.html | 102 +-
docs/reference/elsplineDS.md | 52 +
docs/reference/extractQuantilesDS1.html | 100 +-
docs/reference/extractQuantilesDS1.md | 66 +
docs/reference/extractQuantilesDS2.html | 100 +-
docs/reference/extractQuantilesDS2.md | 65 +
docs/reference/fixClassDS.html | 84 +
docs/reference/fixClassDS.md | 29 +
docs/reference/fixColsDS.html | 79 +
docs/reference/fixColsDS.md | 23 +
docs/reference/fixLevelsDS.html | 83 +
docs/reference/fixLevelsDS.md | 29 +
docs/reference/gamlssDS.html | 105 +-
docs/reference/gamlssDS.md | 158 +
docs/reference/getAllLevelsDS.html | 79 +
docs/reference/getAllLevelsDS.md | 23 +
docs/reference/getClassAllColsDS.html | 75 +
docs/reference/getClassAllColsDS.md | 19 +
docs/reference/getWGSRDS.html | 100 +-
docs/reference/getWGSRDS.md | 92 +
docs/reference/glmDS1.html | 97 +-
docs/reference/glmDS1.md | 50 +
docs/reference/glmDS2.html | 97 +-
docs/reference/glmDS2.md | 57 +
docs/reference/glmPredictDS.ag.html | 101 +-
docs/reference/glmPredictDS.ag.md | 85 +
docs/reference/glmPredictDS.as.html | 102 +-
docs/reference/glmPredictDS.as.md | 81 +
docs/reference/glmSLMADS.assign.html | 100 +-
docs/reference/glmSLMADS.assign.md | 52 +
docs/reference/glmSLMADS1.html | 100 +-
docs/reference/glmSLMADS1.md | 54 +
docs/reference/glmSLMADS2.html | 100 +-
docs/reference/glmSLMADS2.md | 62 +
docs/reference/glmSummaryDS.ag.html | 101 +-
docs/reference/glmSummaryDS.ag.md | 39 +
docs/reference/glmSummaryDS.as.html | 102 +-
docs/reference/glmSummaryDS.as.md | 37 +
docs/reference/glmerSLMADS.assign.html | 100 +-
docs/reference/glmerSLMADS.assign.md | 95 +
docs/reference/glmerSLMADS2.html | 101 +-
docs/reference/glmerSLMADS2.md | 103 +
docs/reference/heatmapPlotDS.html | 97 +-
docs/reference/heatmapPlotDS.md | 63 +
docs/reference/hetcorDS.html | 97 +-
docs/reference/hetcorDS.md | 68 +
docs/reference/histogramDS1.html | 101 +-
docs/reference/histogramDS1.md | 53 +
docs/reference/histogramDS2.html | 103 +-
docs/reference/histogramDS2.md | 65 +
docs/reference/igb_standardsDS.html | 97 +-
docs/reference/igb_standardsDS.md | 68 +
docs/reference/index.html | 1597 ++-
docs/reference/index.md | 386 +
docs/reference/isNaDS.html | 96 +-
docs/reference/isNaDS.md | 25 +
docs/reference/isValidDS.html | 97 +-
docs/reference/isValidDS.md | 27 +
docs/reference/kurtosisDS1.html | 97 +-
docs/reference/kurtosisDS1.md | 37 +
docs/reference/kurtosisDS2.html | 100 +-
docs/reference/kurtosisDS2.md | 43 +
docs/reference/lengthDS.html | 97 +-
docs/reference/lengthDS.md | 27 +
docs/reference/levelsDS.html | 97 +-
docs/reference/levelsDS.md | 27 +
docs/reference/lexisDS1.html | 97 +-
docs/reference/lexisDS1.md | 29 +
docs/reference/lexisDS2.html | 97 +-
docs/reference/lexisDS2.md | 82 +
docs/reference/lexisDS3.html | 89 +-
docs/reference/lexisDS3.md | 20 +
docs/reference/listDS.html | 97 +-
docs/reference/listDS.md | 32 +
docs/reference/listDisclosureSettingsDS.html | 96 +-
docs/reference/listDisclosureSettingsDS.md | 22 +
docs/reference/lmerSLMADS.assign.html | 100 +-
docs/reference/lmerSLMADS.assign.md | 75 +
docs/reference/lmerSLMADS2.html | 101 +-
docs/reference/lmerSLMADS2.md | 86 +
docs/reference/lsDS.html | 100 +-
docs/reference/lsDS.md | 50 +
docs/reference/lsplineDS.html | 102 +-
docs/reference/lsplineDS.md | 49 +
docs/reference/matrixDS.html | 97 +-
docs/reference/matrixDS.md | 60 +
docs/reference/matrixDetDS1.html | 100 +-
docs/reference/matrixDetDS1.md | 38 +
docs/reference/matrixDetDS2.html | 100 +-
docs/reference/matrixDetDS2.md | 38 +
docs/reference/matrixDiagDS.html | 101 +-
docs/reference/matrixDiagDS.md | 45 +
docs/reference/matrixDimnamesDS.html | 100 +-
docs/reference/matrixDimnamesDS.md | 42 +
docs/reference/matrixInvertDS.html | 97 +-
docs/reference/matrixInvertDS.md | 31 +
docs/reference/matrixMultDS.html | 97 +-
docs/reference/matrixMultDS.md | 43 +
docs/reference/matrixTransposeDS.html | 97 +-
docs/reference/matrixTransposeDS.md | 31 +
docs/reference/mdPatternDS.html | 101 +-
docs/reference/mdPatternDS.md | 67 +
docs/reference/meanDS.html | 97 +-
docs/reference/meanDS.md | 28 +
docs/reference/meanSdGpDS.html | 97 +-
docs/reference/meanSdGpDS.md | 34 +
docs/reference/mergeDS.html | 100 +-
docs/reference/mergeDS.md | 114 +
docs/reference/messageDS.html | 100 +-
docs/reference/messageDS.md | 46 +
docs/reference/metadataDS.html | 97 +-
docs/reference/metadataDS.md | 28 +
docs/reference/miceDS.html | 105 +-
docs/reference/miceDS.md | 108 +
docs/reference/minMaxRandDS.html | 101 +-
docs/reference/minMaxRandDS.md | 40 +
docs/reference/namesDS.html | 97 +-
docs/reference/namesDS.md | 37 +
docs/reference/nsDS.html | 101 +-
docs/reference/nsDS.md | 64 +
docs/reference/numNaDS.html | 96 +-
docs/reference/numNaDS.md | 23 +
docs/reference/qlsplineDS.html | 102 +-
docs/reference/qlsplineDS.md | 62 +
docs/reference/quantileMeanDS.html | 96 +-
docs/reference/quantileMeanDS.md | 23 +
docs/reference/rBinomDS.html | 97 +-
docs/reference/rBinomDS.md | 53 +
docs/reference/rNormDS.html | 97 +-
docs/reference/rNormDS.md | 60 +
docs/reference/rPoisDS.html | 97 +-
docs/reference/rPoisDS.md | 45 +
docs/reference/rUnifDS.html | 97 +-
docs/reference/rUnifDS.md | 60 +
docs/reference/rangeDS.html | 96 +-
docs/reference/rangeDS.md | 26 +
docs/reference/ranksSecureDS1.html | 96 +-
docs/reference/ranksSecureDS1.md | 37 +
docs/reference/ranksSecureDS2.html | 102 +-
docs/reference/ranksSecureDS2.md | 45 +
docs/reference/ranksSecureDS3.html | 97 +-
docs/reference/ranksSecureDS3.md | 49 +
docs/reference/ranksSecureDS4.html | 102 +-
docs/reference/ranksSecureDS4.md | 62 +
docs/reference/ranksSecureDS5.html | 102 +-
docs/reference/ranksSecureDS5.md | 61 +
docs/reference/rbindDS.html | 101 +-
docs/reference/rbindDS.md | 56 +
docs/reference/reShapeDS.html | 100 +-
docs/reference/reShapeDS.md | 92 +
docs/reference/recodeLevelsDS.html | 96 +-
docs/reference/recodeLevelsDS.md | 28 +
docs/reference/recodeValuesDS.html | 100 +-
docs/reference/recodeValuesDS.md | 65 +
docs/reference/repDS.html | 103 +-
docs/reference/repDS.md | 145 +
docs/reference/replaceNaDS.html | 100 +-
docs/reference/replaceNaDS.md | 39 +
docs/reference/rmDS.html | 97 +-
docs/reference/rmDS.md | 40 +
docs/reference/rowColCalcDS.html | 100 +-
docs/reference/rowColCalcDS.md | 34 +
docs/reference/sampleDS.html | 101 +-
docs/reference/sampleDS.md | 71 +
docs/reference/scatterPlotDS.html | 100 +-
docs/reference/scatterPlotDS.md | 63 +
docs/reference/seqDS.html | 97 +-
docs/reference/seqDS.md | 81 +
docs/reference/setSeedDS.html | 100 +-
docs/reference/setSeedDS.md | 60 +
docs/reference/skewnessDS1.html | 97 +-
docs/reference/skewnessDS1.md | 37 +
docs/reference/skewnessDS2.html | 100 +-
docs/reference/skewnessDS2.md | 43 +
docs/reference/sqrtDS.html | 97 +-
docs/reference/sqrtDS.md | 30 +
docs/reference/subsetByClassDS.html | 101 +-
docs/reference/subsetByClassDS.md | 41 +
docs/reference/subsetDS.html | 101 +-
docs/reference/subsetDS.md | 86 +
docs/reference/table1DDS.html | 100 +-
docs/reference/table1DDS.md | 37 +
docs/reference/table2DDS.html | 100 +-
docs/reference/table2DDS.md | 42 +
docs/reference/tableDS.assign.html | 100 +-
docs/reference/tableDS.assign.md | 83 +
docs/reference/tableDS.html | 100 +-
docs/reference/tableDS.md | 88 +
docs/reference/tableDS2.html | 100 +-
docs/reference/tableDS2.md | 58 +
docs/reference/tapplyDS.assign.html | 101 +-
docs/reference/tapplyDS.assign.md | 43 +
docs/reference/tapplyDS.html | 101 +-
docs/reference/tapplyDS.md | 43 +
docs/reference/testObjExistsDS.html | 97 +-
docs/reference/testObjExistsDS.md | 30 +
docs/reference/unListDS.html | 101 +-
docs/reference/unListDS.md | 55 +
docs/reference/uniqueDS.html | 97 +-
docs/reference/uniqueDS.md | 28 +
docs/reference/varDS.html | 97 +-
docs/reference/varDS.md | 32 +
docs/reference/vectorDS.html | 97 +-
docs/reference/vectorDS.md | 28 +
docs/search.json | 1 +
docs/sitemap.xml | 5 +
468 files changed, 38164 insertions(+), 8213 deletions(-)
create mode 100644 docs/404.md
create mode 100644 docs/LICENSE.md
create mode 100644 docs/authors.md
create mode 100644 docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js
create mode 100644 docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js.map
create mode 100644 docs/deps/bootstrap-5.3.8/bootstrap.min.css
create mode 100644 docs/deps/bootstrap-5.3.8/font.css
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/07d40e985ad7c747025dabb9f22142c4.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCs6KVjbNBYlgoKcg72j00.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCs6KVjbNBYlgoKcw72j00.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCs6KVjbNBYlgoKew72j00.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCs6KVjbNBYlgoKfA72j00.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCs6KVjbNBYlgoKfw72.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/626330658504e338ee86aec8e957426b.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNBeudwk.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNdeudwk.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNheudwk.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNleudwk.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNteudwk.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fO0KTet_.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fO8KTet_.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fOMKTet_.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fOQKTet_.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/CSR64z1Qlv-GDxkbKVQ_fOwKTet_.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6u8w4BMUTPHjxsAXC-q.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6uyw4BMUTPHjx4wXg.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/S6uyw4BMUTPHjxAwXjeu.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/XRXV3I6Li01BKofIMeaBXso.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/XRXV3I6Li01BKofINeaB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/XRXV3I6Li01BKofIO-aBXso.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/XRXV3I6Li01BKofIOOaBXso.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/XRXV3I6Li01BKofIOuaBXso.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/q5uGsou0JOdh94bfuQltOxU.woff2
create mode 100644 docs/deps/bootstrap-5.3.8/fonts/q5uGsou0JOdh94bfvQlt.woff2
create mode 100644 docs/deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js
create mode 100644 docs/deps/clipboard.js-2.0.11/clipboard.min.js
create mode 100644 docs/deps/data-deps.txt
create mode 100644 docs/deps/font-awesome-6.5.2/css/all.css
create mode 100644 docs/deps/font-awesome-6.5.2/css/all.min.css
create mode 100644 docs/deps/font-awesome-6.5.2/css/v4-shims.css
create mode 100644 docs/deps/font-awesome-6.5.2/css/v4-shims.min.css
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf
create mode 100644 docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2
create mode 100644 docs/deps/headroom-0.11.0/headroom.min.js
create mode 100644 docs/deps/headroom-0.11.0/jQuery.headroom.min.js
create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.js
create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.js
create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.map
create mode 100644 docs/deps/search-1.0.0/autocomplete.jquery.min.js
create mode 100644 docs/deps/search-1.0.0/fuse.min.js
create mode 100644 docs/deps/search-1.0.0/mark.min.js
create mode 100644 docs/index.md
create mode 100644 docs/katex-auto.js
create mode 100644 docs/lightswitch.js
create mode 100644 docs/llms.txt
create mode 100644 docs/reference/BooleDS.md
create mode 100644 docs/reference/absDS.md
create mode 100644 docs/reference/asCharacterDS.md
create mode 100644 docs/reference/asDataMatrixDS.md
create mode 100644 docs/reference/asFactorDS1.md
create mode 100644 docs/reference/asFactorDS2.md
create mode 100644 docs/reference/asFactorSimpleDS.md
create mode 100644 docs/reference/asIntegerDS.md
create mode 100644 docs/reference/asListDS.md
create mode 100644 docs/reference/asLogicalDS.md
create mode 100644 docs/reference/asMatrixDS.md
create mode 100644 docs/reference/asNumericDS.md
create mode 100644 docs/reference/aucDS.md
create mode 100644 docs/reference/blackBoxDS.md
create mode 100644 docs/reference/blackBoxRanksDS.md
create mode 100644 docs/reference/boxPlotGGDS.md
create mode 100644 docs/reference/boxPlotGG_data_TreatmentDS.md
create mode 100644 docs/reference/boxPlotGG_data_Treatment_numericDS.md
create mode 100644 docs/reference/bp_standardsDS.md
create mode 100644 docs/reference/cDS.md
create mode 100644 docs/reference/cbindDS.md
create mode 100644 docs/reference/changeRefGroupDS.md
create mode 100644 docs/reference/checkNegValueDS.md
create mode 100644 docs/reference/checkPermissivePrivacyControlLevel.md
create mode 100644 docs/reference/classDS.md
create mode 100644 docs/reference/colnamesDS.md
create mode 100644 docs/reference/completeCasesDS.md
create mode 100644 docs/reference/corDS.md
create mode 100644 docs/reference/corTestDS.md
create mode 100644 docs/reference/covDS.md
create mode 100644 docs/reference/dataFrameDS.md
create mode 100644 docs/reference/dataFrameFillDS.md
create mode 100644 docs/reference/dataFrameSortDS.md
create mode 100644 docs/reference/dataFrameSubsetDS1.md
create mode 100644 docs/reference/dataFrameSubsetDS2.md
create mode 100644 docs/reference/densityGridDS.md
create mode 100644 docs/reference/dimDS.md
create mode 100644 docs/reference/dmtC2SDS.md
create mode 100644 docs/reference/dsBase-package.md
create mode 100644 docs/reference/elsplineDS.md
create mode 100644 docs/reference/extractQuantilesDS1.md
create mode 100644 docs/reference/extractQuantilesDS2.md
create mode 100644 docs/reference/fixClassDS.html
create mode 100644 docs/reference/fixClassDS.md
create mode 100644 docs/reference/fixColsDS.html
create mode 100644 docs/reference/fixColsDS.md
create mode 100644 docs/reference/fixLevelsDS.html
create mode 100644 docs/reference/fixLevelsDS.md
create mode 100644 docs/reference/gamlssDS.md
create mode 100644 docs/reference/getAllLevelsDS.html
create mode 100644 docs/reference/getAllLevelsDS.md
create mode 100644 docs/reference/getClassAllColsDS.html
create mode 100644 docs/reference/getClassAllColsDS.md
create mode 100644 docs/reference/getWGSRDS.md
create mode 100644 docs/reference/glmDS1.md
create mode 100644 docs/reference/glmDS2.md
create mode 100644 docs/reference/glmPredictDS.ag.md
create mode 100644 docs/reference/glmPredictDS.as.md
create mode 100644 docs/reference/glmSLMADS.assign.md
create mode 100644 docs/reference/glmSLMADS1.md
create mode 100644 docs/reference/glmSLMADS2.md
create mode 100644 docs/reference/glmSummaryDS.ag.md
create mode 100644 docs/reference/glmSummaryDS.as.md
create mode 100644 docs/reference/glmerSLMADS.assign.md
create mode 100644 docs/reference/glmerSLMADS2.md
create mode 100644 docs/reference/heatmapPlotDS.md
create mode 100644 docs/reference/hetcorDS.md
create mode 100644 docs/reference/histogramDS1.md
create mode 100644 docs/reference/histogramDS2.md
create mode 100644 docs/reference/igb_standardsDS.md
create mode 100644 docs/reference/index.md
create mode 100644 docs/reference/isNaDS.md
create mode 100644 docs/reference/isValidDS.md
create mode 100644 docs/reference/kurtosisDS1.md
create mode 100644 docs/reference/kurtosisDS2.md
create mode 100644 docs/reference/lengthDS.md
create mode 100644 docs/reference/levelsDS.md
create mode 100644 docs/reference/lexisDS1.md
create mode 100644 docs/reference/lexisDS2.md
create mode 100644 docs/reference/lexisDS3.md
create mode 100644 docs/reference/listDS.md
create mode 100644 docs/reference/listDisclosureSettingsDS.md
create mode 100644 docs/reference/lmerSLMADS.assign.md
create mode 100644 docs/reference/lmerSLMADS2.md
create mode 100644 docs/reference/lsDS.md
create mode 100644 docs/reference/lsplineDS.md
create mode 100644 docs/reference/matrixDS.md
create mode 100644 docs/reference/matrixDetDS1.md
create mode 100644 docs/reference/matrixDetDS2.md
create mode 100644 docs/reference/matrixDiagDS.md
create mode 100644 docs/reference/matrixDimnamesDS.md
create mode 100644 docs/reference/matrixInvertDS.md
create mode 100644 docs/reference/matrixMultDS.md
create mode 100644 docs/reference/matrixTransposeDS.md
create mode 100644 docs/reference/mdPatternDS.md
create mode 100644 docs/reference/meanDS.md
create mode 100644 docs/reference/meanSdGpDS.md
create mode 100644 docs/reference/mergeDS.md
create mode 100644 docs/reference/messageDS.md
create mode 100644 docs/reference/metadataDS.md
create mode 100644 docs/reference/miceDS.md
create mode 100644 docs/reference/minMaxRandDS.md
create mode 100644 docs/reference/namesDS.md
create mode 100644 docs/reference/nsDS.md
create mode 100644 docs/reference/numNaDS.md
create mode 100644 docs/reference/qlsplineDS.md
create mode 100644 docs/reference/quantileMeanDS.md
create mode 100644 docs/reference/rBinomDS.md
create mode 100644 docs/reference/rNormDS.md
create mode 100644 docs/reference/rPoisDS.md
create mode 100644 docs/reference/rUnifDS.md
create mode 100644 docs/reference/rangeDS.md
create mode 100644 docs/reference/ranksSecureDS1.md
create mode 100644 docs/reference/ranksSecureDS2.md
create mode 100644 docs/reference/ranksSecureDS3.md
create mode 100644 docs/reference/ranksSecureDS4.md
create mode 100644 docs/reference/ranksSecureDS5.md
create mode 100644 docs/reference/rbindDS.md
create mode 100644 docs/reference/reShapeDS.md
create mode 100644 docs/reference/recodeLevelsDS.md
create mode 100644 docs/reference/recodeValuesDS.md
create mode 100644 docs/reference/repDS.md
create mode 100644 docs/reference/replaceNaDS.md
create mode 100644 docs/reference/rmDS.md
create mode 100644 docs/reference/rowColCalcDS.md
create mode 100644 docs/reference/sampleDS.md
create mode 100644 docs/reference/scatterPlotDS.md
create mode 100644 docs/reference/seqDS.md
create mode 100644 docs/reference/setSeedDS.md
create mode 100644 docs/reference/skewnessDS1.md
create mode 100644 docs/reference/skewnessDS2.md
create mode 100644 docs/reference/sqrtDS.md
create mode 100644 docs/reference/subsetByClassDS.md
create mode 100644 docs/reference/subsetDS.md
create mode 100644 docs/reference/table1DDS.md
create mode 100644 docs/reference/table2DDS.md
create mode 100644 docs/reference/tableDS.assign.md
create mode 100644 docs/reference/tableDS.md
create mode 100644 docs/reference/tableDS2.md
create mode 100644 docs/reference/tapplyDS.assign.md
create mode 100644 docs/reference/tapplyDS.md
create mode 100644 docs/reference/testObjExistsDS.md
create mode 100644 docs/reference/unListDS.md
create mode 100644 docs/reference/uniqueDS.md
create mode 100644 docs/reference/varDS.md
create mode 100644 docs/reference/vectorDS.md
create mode 100644 docs/search.json
diff --git a/README.md b/README.md
index bf9c1ada..fc5911ab 100644
--- a/README.md
+++ b/README.md
@@ -23,8 +23,8 @@ And the development version from
install.packages("remotes")
remotes::install_github("datashield/dsBase", "")
-# Install v6.3.4 with the following
-remotes::install_github("datashield/dsBase", "6.3.4")
+# Install v6.3.6 with the following
+remotes::install_github("datashield/dsBase", "6.3.6")
```
For a full list of development branches, checkout https://github.com/datashield/dsBase/branches
diff --git a/_pkgdown.yml b/_pkgdown.yml
index 4c98f6e5..4dc66bb0 100644
--- a/_pkgdown.yml
+++ b/_pkgdown.yml
@@ -1,3 +1,4 @@
template:
+ bootstrap: 5
params:
bootswatch: simplex
diff --git a/docs/404.html b/docs/404.html
index 91a82d08..17940f30 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -4,90 +4,70 @@
-
+
Page not found (404) • dsBase
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-