From 220d58691f16fbb9188ffa046c538b8ec6557869 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Sun, 13 Jul 2025 22:58:23 +0100 Subject: [PATCH 001/148] Initial fixes due to update --- DESCRIPTION | 3 ++- azure-pipelines.yml | 2 +- tests/testthat/helper.R | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 31c7e951..d27c2dbb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -59,7 +59,8 @@ Imports: childsds, purrr, tibble, - tidyselect + tidyselect, + tidytable Suggests: testthat RoxygenNote: 7.3.2 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 86557410..a36b42c3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -122,7 +122,7 @@ jobs: sudo R -e "install.packages('purrr', dependencies=TRUE)" sudo R -e "install.packages('tibble', dependencies=TRUE)" sudo R -e "install.packages('tidyselect', dependencies=TRUE)" - sudo R -e "install.packages('tidyverse', dependencies=TRUE)" + sudo R -e "install.packages('tidytable', dependencies=TRUE)" displayName: 'Install all dependencies for dsBase' condition: succeeded() diff --git a/tests/testthat/helper.R b/tests/testthat/helper.R index e27e90e5..403fdfb9 100644 --- a/tests/testthat/helper.R +++ b/tests/testthat/helper.R @@ -37,7 +37,7 @@ create_mixed_dataframe <- function(n_rows = 10000, n_factor_cols = 15, n_other_c c("Summer", "Winter", "Spring", "Fall") ) - factor_columns <- map_dfc(factor_levels[1:n_factor_cols], create_factor_column) + factor_columns <- purrr::map_dfc(factor_levels[1:n_factor_cols], create_factor_column) colnames(factor_columns) <- paste0("fac_col", 1:n_factor_cols) create_other_column <- function(type, n = n_rows) { @@ -55,7 +55,7 @@ create_mixed_dataframe <- function(n_rows = 10000, n_factor_cols = 15, n_other_c "num", "str", "int", "num", "str" ) - other_columns <- map_dfc(column_types[1:n_other_cols], create_other_column) + other_columns <- purrr::map_dfc(column_types[1:n_other_cols], create_other_column) colnames(other_columns) <- paste0("col", (n_factor_cols + 1):(n_factor_cols + n_other_cols)) df <- bind_cols(factor_columns, other_columns) From 09466bbaa9ca92873ea17233e5ec01a3007894d2 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 15 Jul 2025 11:03:34 +0100 Subject: [PATCH 002/148] Add file with key citations for DataSHIELD --- inst/CITATION | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 inst/CITATION diff --git a/inst/CITATION b/inst/CITATION new file mode 100644 index 00000000..2be63039 --- /dev/null +++ b/inst/CITATION @@ -0,0 +1,131 @@ +bibentry( + bibtype = "Article", + title = "{DataSHIELD: taking the analysis to the data, not the data to the analysis}", + author = c( + person("Amadou", "Gaye"), + person("Yannick", "Marcon"), + person("Julia", "Isaeva"), + person("Philippe", "{LaFlamme}"), + person("Andrew", "Turner"), + person("Elinor M", "Jones"), + person("Joel", "Minion"), + person("Andrew W", "Boyd"), + person("Christopher J", "Newby"), + person("Marja-Liisa", "Nuotio"), + person("Rebecca", "Wilson"), + person("Oliver", "Butters"), + person("Barnaby", "Murtagh"), + person("Ipek", "Demir"), + person("Dany", "Doiron"), + person("Lisette", "Giepmans"), + person("Susan E", "Wallace"), + person("Isabelle", "Budin-Lj{\\o}sne"), + person("Carsten", "{Oliver Schmidt}"), + person("Paolo", "Boffetta"), + person("Mathieu", "Boniol"), + person("Maria", "Bota"), + person("Kim W", "Carter"), + person("Nick", "{deKlerk}"), + person("Chris", "Dibben"), + person("Richard W", "Francis"), + person("Tero", "Hiekkalinna"), + person("Kristian", "Hveem"), + person("Kirsti", "Kval{\\o}y"), + person("Sean", "Millar"), + person("Ivan J", "Perry"), + person("Annette", "Peters"), + person("Catherine M", "Phillips"), + person("Frank", "Popham"), + person("Gillian", "Raab"), + person("Eva", "Reischl"), + person("Nuala", "Sheehan"), + person("Melanie", "Waldenberger"), + person("Markus", "Perola"), + person("Edwin", "{van den Heuvel}"), + person("John", "Macleod"), + person("Bartha M", "Knoppers"), + person("Ronald P", "Stolk"), + person("Isabel", "Fortier"), + person("Jennifer R", "Harris"), + person("Bruce H R", "Woffenbuttel"), + person("Madeleine J", "Murtagh"), + person("Vincent", "Ferretti"), + person("Paul R", "Burton") + ), + journal = "International Journal of Epidemiology", + year = "2014", + volume = "43", + number = "6", + pages = "1929--1944", + doi = "10.1093/ije/dyu188", +) + +bibentry( + bibtype = "Article", + title = "{DataSHIELD – New Directions and Dimensions}", + author = c( + person("Rebecca C.", "Wilson"), + person("Oliver", "W. Butters"), + person("Demetris", "Avraam"), + person("James", "Baker"), + person("Jonathan A.", "Tedds"), + person("Andrew", "Turner"), + person("Madeleine", "Murtagh"), + person("Paul", "R. Burton") + ), + journal = "Data Science Journal", + year = "2017", + volume = "16", + number = "21", + pages = "1--21", + doi = "10.5334/dsj-2017-021" +) + +bibentry( + bibtype = "Article", + title = "{DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform}", + author = c( + person("Demetris", "Avraam"), + person("Rebecca C", "Wilson"), + person("Noemi", "{Aguirre Chan}"), + person("Soumya", "Banerjee"), + person("Tom R P", "Bishop"), + person("Olly", "Butters"), + person("Tim", "Cadman"), + person("Luise", "Cederkvist"), + person("Liesbeth", "Duijts"), + person("Xavier", "{Escrib{\\a`a} Montagut}"), + person("Hugh", "Garner"), + person("Gon{\\c c}alo", "Gon{\\c c}alves"), + person("Juan R", "Gonz{\\a'a}lez"), + person("Sido", "Haakma"), + person("Mette", "Hartlev"), + person("Jan", "Hasenauer"), + person("Manuel", "Huth"), + person("Eleanor", "Hyde"), + person("Vincent W V", "Jaddoe"), + person("Yannick", "Marcon"), + person("Michaela Th", "Mayrhofer"), + person("Fruzsina", "Molnar-Gabor"), + person("Andrei Scott", "Morgan"), + person("Madeleine", "Murtagh"), + person("Marc", "Nestor"), + person("Anne-Marie", "{Nybo Andersen}"), + person("Simon", "Parker"), + person("Angela", "{Pinot de Moira}"), + person("Florian", "Schwarz"), + person("Katrine", "Strandberg-Larsen"), + person("Morris AvSwertz"), + person("Marieke", "Welten"), + person("Stuart", "Wheater"), + person("Paul", "Burton") + ), + journal = "Bioinformatics Advances", + year = "2024", + volume = "5", + number = "1", + pages = "1--21", + doi = "10.1093/bioadv/vbaf046", + editor = person("Thomas", "Lengauer"), + publisher = "Oxford University Press (OUP)" +) From 654e914f77112294477e2122cd8ce20b159f664f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 15 Jul 2025 12:24:41 +0100 Subject: [PATCH 003/148] Update DESCRIPTION to include reference to the citations --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3943a07f..1c5c6270 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -4,7 +4,7 @@ Description: Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a you to do non-disclosive federated analysis on sensitive data. 'DataSHIELD' analytic functions have 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. + the automated output checks. For more details, see 'citation("dsBase")'. Version: 6.3.3 Authors@R: c(person(given = "Paul", family = "Burton", From b9ef5aca3c0d0465a696606063361372b407dddf Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 16 Jul 2025 11:58:10 +0100 Subject: [PATCH 004/148] Update documents --- docs/authors.html | 4 ++-- docs/pkgdown.yml | 2 +- docs/reference/BooleDS.html | 7 +++++-- docs/reference/asFactorDS2.html | 2 +- .../checkPermissivePrivacyControlLevel.html | 10 +++++++--- docs/reference/covDS.html | 2 +- docs/reference/glmDS1.html | 8 ++++++-- docs/reference/glmDS2.html | 8 ++++++-- docs/reference/heatmapPlotDS.html | 2 +- docs/reference/histogramDS1.html | 6 +++--- docs/reference/histogramDS2.html | 2 +- docs/reference/lexisDS1.html | 8 ++++++-- docs/reference/lexisDS2.html | 8 ++++++-- docs/reference/lexisDS3.html | 4 ++++ docs/reference/listDisclosureSettingsDS.html | 4 ++++ docs/reference/matrixMultDS.html | 2 +- docs/reference/meanSdGpDS.html | 12 ++++++++---- docs/reference/scatterPlotDS.html | 2 +- docs/reference/subsetDS.html | 14 +++++++------- docs/reference/table1DDS.html | 2 +- docs/reference/table2DDS.html | 2 +- docs/reference/testObjExistsDS.html | 10 +++++++--- 22 files changed, 80 insertions(+), 41 deletions(-) diff --git a/docs/authors.html b/docs/authors.html index cc06044e..345f4351 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -89,11 +89,11 @@

Citation

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Wheater S (2025). -dsBase: DataSHIELD Server Site Base Functions. +dsBase: 'DataSHIELD' Server Site Base Functions. R package version 6.3.3.

@Manual{,
-  title = {dsBase: DataSHIELD Server Site Base Functions},
+  title = {dsBase: 'DataSHIELD' Server Site 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 Stuart Wheater},
   year = {2025},
   note = {R package version 6.3.3},
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml
index 5c084b52..ca6da52a 100644
--- a/docs/pkgdown.yml
+++ b/docs/pkgdown.yml
@@ -2,4 +2,4 @@ pandoc: 3.1.3
 pkgdown: 2.1.3
 pkgdown_sha: ~
 articles: {}
-last_built: 2025-07-01T22:30Z
+last_built: 2025-07-16T10:31Z
diff --git a/docs/reference/BooleDS.html b/docs/reference/BooleDS.html
index 452f7f13..03e2b322 100644
--- a/docs/reference/BooleDS.html
+++ b/docs/reference/BooleDS.html
@@ -81,8 +81,7 @@ 

Arguments

A character string taking values 'NA', '1' or '0'. If 'NA' then any NA values in the input vector remain as NAs in the output vector. If '1' or '0' NA values in the -input vector are -all converted to 1 or 0 respectively.#' @return the levels of the input variable.

+input vector are all converted to 1 or 0 respectively.

numeric.output
@@ -91,6 +90,10 @@

Arguments

should be of class numeric (1/0) or class logical (TRUE/FALSE).

+
+

Value

+

the levels of the input variable.

+

Details

The function converts the input vector into Boolean indicators.

diff --git a/docs/reference/asFactorDS2.html b/docs/reference/asFactorDS2.html index 839d0522..a3ebf298 100644 --- a/docs/reference/asFactorDS2.html +++ b/docs/reference/asFactorDS2.html @@ -69,7 +69,7 @@

Arguments

fixed.dummy.vars

a boolean that determines whether the new object will be represented as a vector or as a matrix of dummy variables indicating the factor level of each data point. -If this argyment is set to FALSE (default) then the input variable is converted to a factor and +If this argument is set to FALSE (default) then the input variable is converted to a factor and assigned as a vector. If is set to TRUE then the input variable is converted to a factor but assigned as a matrix of dummy variables.

diff --git a/docs/reference/checkPermissivePrivacyControlLevel.html b/docs/reference/checkPermissivePrivacyControlLevel.html index 045de671..f570d1b1 100644 --- a/docs/reference/checkPermissivePrivacyControlLevel.html +++ b/docs/reference/checkPermissivePrivacyControlLevel.html @@ -1,5 +1,5 @@ -checkPermissivePrivacyControlLevel — checkPermissivePrivacyControlLevel • dsBasecheckPermissivePrivacyControlLevel — checkPermissivePrivacyControlLevel • dsBase @@ -40,7 +40,7 @@

checkPermissivePrivacyControlLevel

-

This serverside function check that the server is running in "permissive" privacy control level.

+

This server-side function check that the server is running in "permissive" privacy control level.

@@ -55,6 +55,10 @@

Arguments

is a vector of strings which contains the privacy control level names which are permitted by the calling method.

+
+

Value

+

No return value, called for side effects

+

Details

Tests whether the R option "datashield.privacyControlLevel" is set to "permissive", if it isn't @@ -63,7 +67,7 @@

Details

Author

-

Wheater, Dr SM., DataSHIELD Team.

+

Wheater, Dr SM., DataSHIELD Development Team.

diff --git a/docs/reference/covDS.html b/docs/reference/covDS.html index ec3dfaff..5b7d4204 100644 --- a/docs/reference/covDS.html +++ b/docs/reference/covDS.html @@ -76,7 +76,7 @@

Value

a list that includes a matrix with elements the sum of products between each two variables, a matrix with elements the sum of the values of each variable, a matrix with elements the number of complete cases in each pair of variables, a list with the number of missing values in each variable separately (columnwise) and the number -of missing values casewise or pairwise depending on the arqument use, and an error message which indicates +of missing values casewise or pairwise depending on the argument use, and an error message which indicates whether or not the input variables pass the disclosure controls. 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 diff --git a/docs/reference/glmDS1.html b/docs/reference/glmDS1.html index 38a6a16c..80525b07 100644 --- a/docs/reference/glmDS1.html +++ b/docs/reference/glmDS1.html @@ -1,5 +1,5 @@ -glmDS1 called by ds.glm — glmDS1 • dsBaseglmDS1 called by ds.glm — glmDS1 • dsBase @@ -40,7 +40,7 @@

glmDS1 called by ds.glm

-

This is the first serverside aggregate function called by ds.glm

+

This is the first server-side aggregate function called by ds.glm

@@ -75,6 +75,10 @@

Arguments

analysed under the specified model

+
+

Value

+

List with values from GLM model.

+

Details

It is an diff --git a/docs/reference/glmDS2.html b/docs/reference/glmDS2.html index 2cefd28f..0f9df3f4 100644 --- a/docs/reference/glmDS2.html +++ b/docs/reference/glmDS2.html @@ -1,5 +1,5 @@ -glmDS2 called by ds.glm — glmDS2 • dsBaseglmDS2 called by ds.glm — glmDS2 • dsBase @@ -40,7 +40,7 @@

glmDS2 called by ds.glm

-

This is the second serverside aggregate function called by ds.glm.

+

This is the second server-side aggregate function called by ds.glm.

@@ -79,6 +79,10 @@

Arguments

the data to be analysed under the specified model same

+
+

Value

+

List with values from GLM model

+

Details

It is an aggregate function that uses the model structure and starting diff --git a/docs/reference/heatmapPlotDS.html b/docs/reference/heatmapPlotDS.html index eb3715fa..cf9941b6 100644 --- a/docs/reference/heatmapPlotDS.html +++ b/docs/reference/heatmapPlotDS.html @@ -60,7 +60,7 @@

Arguments

k
-

the number of the nearest neghbours for which their centroid is calculated if the +

the number of the nearest neighbours for which their centroid is calculated if the method.indicator is equal to 1 (i.e. deterministic method).

diff --git a/docs/reference/histogramDS1.html b/docs/reference/histogramDS1.html index 59888e26..2a83be22 100644 --- a/docs/reference/histogramDS1.html +++ b/docs/reference/histogramDS1.html @@ -2,7 +2,7 @@ returns the minimum and the maximum of the input numeric vector — histogramDS1 • dsBaselexisDS1 — lexisDS1 • dsBaselexisDS1 — lexisDS1 • dsBase @@ -40,7 +40,7 @@

lexisDS1

-

The first serverside function called by ds.lexis.

+

The first server-side function called by ds.lexis.

@@ -55,6 +55,10 @@

Arguments

a character string specifying the variable holding the time that each individual is censored or fails

+
+

Value

+

List with `max.time`

+

Details

This is an aggregate function. diff --git a/docs/reference/lexisDS2.html b/docs/reference/lexisDS2.html index 39b99d50..89ebeabf 100644 --- a/docs/reference/lexisDS2.html +++ b/docs/reference/lexisDS2.html @@ -78,7 +78,7 @@

Arguments

idCol

a clientside generated character string specifying the variable -holding the IDs of indivuals in the data set to be expanded

+holding the IDs of individuals in the data set to be expanded

entryCol
@@ -103,6 +103,10 @@

Arguments

'data' argument is set the full data.frame will be expanded and carried forward

+
+

Value

+

List with `expanded.table`

+

Details

This is the assign @@ -111,7 +115,7 @@

Details

regression. lexisDS2 also carries out a series of disclosure checks and if the arguments or data fail any of those tests, -creation of the exapanded dataframe is blocked and an appropriate serverside error +creation of the expanded dataframe is blocked and an appropriate serverside error message is stored. For more details see the extensive header for ds.lexis.

diff --git a/docs/reference/lexisDS3.html b/docs/reference/lexisDS3.html index 023ff8e4..dc237cda 100644 --- a/docs/reference/lexisDS3.html +++ b/docs/reference/lexisDS3.html @@ -47,6 +47,10 @@

@title lexisDS3

lexisDS3()
+
+

Value

+

Data frame with `messageobj` object

+

Details

This is an assign function that simplifies the diff --git a/docs/reference/listDisclosureSettingsDS.html b/docs/reference/listDisclosureSettingsDS.html index 10134413..549c94e3 100644 --- a/docs/reference/listDisclosureSettingsDS.html +++ b/docs/reference/listDisclosureSettingsDS.html @@ -49,6 +49,10 @@

listDisclosureSettingsDS

listDisclosureSettingsDS()
+
+

Value

+

List with DataSHIELD disclosure settings

+

Details

For more details see the extensive header for ds.listDisclosureSettings

diff --git a/docs/reference/matrixMultDS.html b/docs/reference/matrixMultDS.html index 6af3ff82..c782eaac 100644 --- a/docs/reference/matrixMultDS.html +++ b/docs/reference/matrixMultDS.html @@ -69,7 +69,7 @@

Value

Details

Undertakes standard matrix multiplication where with input matrices A and B with -dimensions A: mxn and B: nxp the output C has dimensions mxp and each elemnt C[i,j] has +dimensions A: mxn and B: nxp the output C has dimensions mxp and each element C[i,j] has value equal to the dot product of row i of A and column j of B where the dot product is obtained as sum(A[i,1]*B[1,j] + A[i,2]*B[2,j] + .... + A[i,n]*B[n,j]). This calculation is only valid if the number of columns of A is the same as the number of rows of B

diff --git a/docs/reference/meanSdGpDS.html b/docs/reference/meanSdGpDS.html index d60d33d7..7e902552 100644 --- a/docs/reference/meanSdGpDS.html +++ b/docs/reference/meanSdGpDS.html @@ -1,5 +1,5 @@ -MeanSdGpDS — meanSdGpDS • dsBaseMeanSdGpDS — meanSdGpDS • dsBase @@ -40,7 +40,7 @@

MeanSdGpDS

-

Serverside function called by ds.meanSdGp

+

Server-side function called by ds.meanSdGp

@@ -52,15 +52,19 @@

Arguments

X
-

a clientside supplied character string identifying the variable for which +

a client-side supplied character string identifying the variable for which means/SDs are to be calculated

INDEX
-

a clientside supplied character string identifying the factor across +

a client-side supplied character string identifying the factor across which means/SDs are to be calculated

+
+

Value

+

List with results from the group statistics

+

Details

Computes the mean and standard deviation across groups defined by one diff --git a/docs/reference/scatterPlotDS.html b/docs/reference/scatterPlotDS.html index b1298f5d..2e3d5407 100644 --- a/docs/reference/scatterPlotDS.html +++ b/docs/reference/scatterPlotDS.html @@ -68,7 +68,7 @@

Arguments

k
-

the number of the nearest neghbours for which their centroid is calculated if the +

the number of the nearest neighbours for which their centroid is calculated if the deterministic method is selected.

diff --git a/docs/reference/subsetDS.html b/docs/reference/subsetDS.html index 8bc2f861..19e73aab 100644 --- a/docs/reference/subsetDS.html +++ b/docs/reference/subsetDS.html @@ -1,7 +1,7 @@ Generates a valid subset of a table or a vector — subsetDS • dsBase @@ -43,8 +43,8 @@

Generates a valid subset of a table or a vector

The function uses the R classical subsetting with squared brackets '[]' and allows also to -subset using a logical oprator and a threshold. The object to subset from must be a vector (factor, numeric -or charcater) or a table (data.frame or matrix).

+subset using a logical operator and a threshold. The object to subset from must be a vector (factor, numeric +or character) or a table (data.frame or matrix).

@@ -92,18 +92,18 @@

Arguments

varname

a character, if the input data is a table, if this parameter is provided along with the 'logical' and 'threshold' -parameters, a subtable is based the threshold applied to the speicified variable. This parameter is however ignored if the parameter +parameters, a subtable is based the threshold applied to the specified variable. This parameter is however ignored if the parameter 'rows' and/or 'cols' are provided.

Value

-

a subset of the vector, matric or dataframe as specified is stored on the server side

+

a subset of the vector, matrix or dataframe as specified is stored on the server side

Details

If the input data is a table: The user specifies the rows and/or columns to include in the subset if the input -object is a table; the columns can be refered to by their names. The name of a vector (i.e. a variable) can also be provided +object is a table; the columns can be referred to by their names. The name of a vector (i.e. a variable) can also be provided with a logical operator and a threshold (see example 3). If the input data is a vector: when the parameters 'rows', 'logical' and 'threshold' are all provided the last two are ignored ( 'rows' has precedence over the other two parameters then). diff --git a/docs/reference/table1DDS.html b/docs/reference/table1DDS.html index 6796312e..82d157f7 100644 --- a/docs/reference/table1DDS.html +++ b/docs/reference/table1DDS.html @@ -65,7 +65,7 @@

Value

Details

It generates a 1-dimensional tables where valid (non-disclosive) 1-dimensional tables are defined -as data from sources where no table cells have counts between 1 and the set threshold. When the ouput table +as data from sources where no table cells have counts between 1 and the set threshold. When the output table is invalid all cells but the total count are replaced by missing values. Only the total count is visible on the table returned to the client site. A message is also returned with the 1-dimensional; the message says "invalid table - invalid counts present" if the table is invalid and 'valid table' otherwise.

diff --git a/docs/reference/table2DDS.html b/docs/reference/table2DDS.html index 501a2273..0b5f74e1 100644 --- a/docs/reference/table2DDS.html +++ b/docs/reference/table2DDS.html @@ -69,7 +69,7 @@

Value

Details

It generates 2-dimensional contingency tables where valid (non-disclosive) tables are defined -as those where none of their cells have counts between 1 and the set threshold "nfilter.tab". When the ouput table +as those where none of their cells have counts between 1 and the set threshold "nfilter.tab". When the output table is invalid all cells except the total counts are replaced by missing values. Only the total counts are visible on the table returned to the client side. A message is also returned with the 2-dimensional table; the message says "invalid table - invalid counts present" if the table is invalid and 'valid table' otherwise.

diff --git a/docs/reference/testObjExistsDS.html b/docs/reference/testObjExistsDS.html index 09cb4b5f..a0246beb 100644 --- a/docs/reference/testObjExistsDS.html +++ b/docs/reference/testObjExistsDS.html @@ -1,5 +1,5 @@ -testObjExistsDS — testObjExistsDS • dsBasetestObjExistsDS — testObjExistsDS • dsBase @@ -40,7 +40,7 @@

testObjExistsDS

-

The serverside function called by ds.testObjExists

+

The server-side function called by ds.testObjExists

@@ -52,10 +52,14 @@

Arguments

test.obj.name
-

a clientside provided character string specifying the variable +

a client-side provided character string specifying the variable whose presence is to be tested in each data source

+
+

Value

+

List with `test.obj.exists` and `test.obj.class`

+

Details

Tests whether a given object exists in From 4babeed6277bdd6f9a617903536a1a358c6b5c9f Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 16 Jul 2025 11:58:41 +0100 Subject: [PATCH 005/148] Added 'cran-comments' --- .Rbuildignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.Rbuildignore b/.Rbuildignore index 561a653e..59863e10 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,4 +9,5 @@ ^pkgdown$ ^\.circleci$ ^\.circleci/config\.yml$ -^\.github$ \ No newline at end of file +^\.github$ +^cran-comments\.md$ From 89f9256bdaa781fe577b068c5707851b742a93bc Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 16 Jul 2025 13:18:29 +0100 Subject: [PATCH 006/148] Add missing bibentry to auto-link the R package citation --- inst/CITATION | 3 +++ 1 file changed, 3 insertions(+) diff --git a/inst/CITATION b/inst/CITATION index 2be63039..0d81fdd6 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,3 +1,6 @@ +bibentry("Manual", + other = unlist(citation(auto = meta), recursive = FALSE)) + bibentry( bibtype = "Article", title = "{DataSHIELD: taking the analysis to the data, not the data to the analysis}", From f8e19f3ebf8ee91ada72640a49417a10e1976e4f Mon Sep 17 00:00:00 2001 From: Olly Butters Date: Mon, 21 Jul 2025 13:05:58 +0100 Subject: [PATCH 007/148] Added authors and orcids --- DESCRIPTION | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1c5c6270..7b1f7697 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -8,16 +8,20 @@ Description: Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a Version: 6.3.3 Authors@R: c(person(given = "Paul", family = "Burton", - role = c("aut")), + role = c("aut"), + comment = c(ORCID = "0000-0001-5799-9634")), person(given = "Rebecca", family = "Wilson", - role = c("aut")), + role = c("aut"), + comment = c(ORCID = "0000-0003-2294-593X")), person(given = "Olly", family = "Butters", - role = c("aut")), + role = c("aut"), + comment = c(ORCID = "0000-0003-0354-8461")), person(given = "Patricia", family = "Ryser-Welch", - role = c("aut")), + role = c("aut"), + comment = c(ORCID = "0000-0002-0070-0264")), person(given = "Alex", family = "Westerberg", role = c("aut")), @@ -37,6 +41,17 @@ Authors@R: c(person(given = "Paul", role = c("aut"), email = "yannick.marcon@obiba.org", comment = c(ORCID = "0000-0003-0138-2023")), + person(given = "Tom", + family = "Bishop", + role = c("aut")), + person(given = "Amadou", + family = "Gaye", + role = c("aut"), + comment = c(ORCID = "0000-0002-1180-2792")), + person(given = "Xavier", + family = "Escribà-Montagut", + role = c("aut"), + comment = c(ORCID = "0000-0003-2888-8948")), person(given = "Stuart", family = "Wheater", role = c("aut", "cre"), From c17fa3a97409b8909c3f8d79d8576012cb5aa183 Mon Sep 17 00:00:00 2001 From: Olly Butters Date: Mon, 21 Jul 2025 13:09:37 +0100 Subject: [PATCH 008/148] Title: Site -> Side --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7b1f7697..28b3d917 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: dsBase -Title: 'DataSHIELD' Server Site Base Functions +Title: 'DataSHIELD' Server Side Base Functions Description: Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a software package which allows you to do non-disclosive federated analysis on sensitive data. 'DataSHIELD' analytic functions have been designed to only share non disclosive summary statistics, with built in automated output From 918477c55826ab1806cda782f52c3be84ff95513 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 21 Jul 2025 13:30:58 +0100 Subject: [PATCH 009/148] Skip these tests on Apple M1 architecture, unresolved issue --- tests/testthat/test-smk-corTestDS.R | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R index be006fe4..ba2560e8 100644 --- a/tests/testthat/test-smk-corTestDS.R +++ b/tests/testthat/test-smk-corTestDS.R @@ -12,6 +12,9 @@ # Set up # +# Skip these tests on Apple M1 mac +skip_on_os("mac", arch = "aarch64") + context("corTestDS::smk::setup") # From f2f123132cb55a88e1eccbc03cbc8b4997ed7da6 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Mon, 21 Jul 2025 13:42:26 +0100 Subject: [PATCH 010/148] Update version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 28b3d917..8c7be464 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.3 +Version: 6.3.4-9000 Authors@R: c(person(given = "Paul", family = "Burton", role = c("aut"), From a1f1178e9da93340e1d0ffce26444f1e1a1a3633 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 21 Jul 2025 13:46:15 +0100 Subject: [PATCH 011/148] Add CRAN release badge, title, installation instructions and references --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index aac29667..f78a2c3e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,35 @@ -dsBase -====== +## dsBase: 'DataSHIELD' Server Site Base Functions -DataSHIELD server side base R library. +[![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html) +[![](https://www.r-pkg.org/badges/version/dsBase?color=black)](https://cran.r-project.org/package=dsBase) +[![R build +status](https://github.com/datashield/dsBase/workflows/R-CMD-check/badge.svg)](https://github.com/datashield/dsBase/actions) -[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html) +## Installation -About -===== +You can install the released version of dsBase from +[CRAN](https://cran.r-project.org/package=dsBase) with: + +``` r +install.packages("dsBase") +``` + +And the development version from +[GitHub](https://github.com/datashield/dsBase/) with: + + +``` r +install.packages("remotes") +remotes::install_github("datashield/dsBase", "") + +# Install v6.4.0 with the following +remotes::install_github("datashield/dsBase", "v6.4.0-dev") +``` + +For a full list of development branches, checkout https://github.com/datashield/dsBase/branches + + +## About DataSHIELD is a software package which allows you to do non-disclosive federated analysis on sensitive data. Our website (https://www.datashield.org) has in depth descriptions of what it is, how it works and how to install it. A key point to highlight is that DataSHIELD has a client-server infrastructure, so the dsBase package (https://github.com/datashield/dsBase) needs to be used in conjuction with the dsBaseClient package (https://github.com/datashield/dsBaseClient) - trying to use one without the other makes no sense. @@ -18,3 +41,30 @@ Detailed instructions on how to install DataSHIELD are at https://wiki.datashiel | obiba CRAN | Where you probably should install DataSHIELD from. | | releases | Stable releases. | | master branch | Mostly in sync with the latest release, changes rarely. | + +## References + +[1] Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, + Avraam D, Marcon Y, Wheater S (2025). _dsBase: 'DataSHIELD' Server Site Base Functions_. R + package version 6.3.3. . + +[2] 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, + Oliver 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.” _International + Journal of Epidemiology_, *43*(6), 1929-1944. . + +[3] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, R. Burton P (2017). + “DataSHIELD – New Directions and Dimensions.” _Data Science Journal_, *16*(21), 1-21. + . + +[4] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, + Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, + Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, + Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, + Strandberg-Larsen K, Morris AvSwertz, Welten M, Wheater S, Burton P (2024). “DataSHIELD: + mitigating disclosure risk in a multi-site federated analysis platform.” _Bioinformatics + Advances_, *5*(1), 1-21. . From 5582620c2861e62e94c166f7b4305f9f33499243 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 21 Jul 2025 13:56:04 +0100 Subject: [PATCH 012/148] Correct title and citation for main package --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f78a2c3e..de46eade 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## dsBase: 'DataSHIELD' Server Site Base Functions +## dsBase: 'DataSHIELD' Server Side Base Functions [![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html) [![](https://www.r-pkg.org/badges/version/dsBase?color=black)](https://cran.r-project.org/package=dsBase) @@ -45,7 +45,7 @@ Detailed instructions on how to install DataSHIELD are at https://wiki.datashiel ## References [1] Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, - Avraam D, Marcon Y, Wheater S (2025). _dsBase: 'DataSHIELD' Server Site Base Functions_. R + Avraam D, Marcon Y, Bishop T, Gaye A, Escribà Montagut X, Wheater S (2025). _dsBase: 'DataSHIELD' Server Side Base Functions_. R package version 6.3.3. . [2] Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion J, Boyd A, Newby C, Nuotio From c5088ce5f11cb8f08115450a71ceb2e6a28189cd Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 21 Jul 2025 16:23:28 +0100 Subject: [PATCH 013/148] Add new workflow based on old azure-pipelines.yml file --- .github/workflows/R-CMD-check-source.yaml | 185 ++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 .github/workflows/R-CMD-check-source.yaml diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml new file mode 100644 index 00000000..2f53f446 --- /dev/null +++ b/.github/workflows/R-CMD-check-source.yaml @@ -0,0 +1,185 @@ +################################################################################ +# DataSHIELD GHA test suite - dsBase +# Adapted from `azure-pipelines.yml` by Roberto Villegas-Diaz +# +# OVERVIEW +# +# Inside the root directory $(Pipeline.Workspace) will be a file tree like: +# /dsBase <- Checked out version of datashield/dsBase +# /testStatus <- Checked out version of datashield/testStatus +# /logs <- Where results of tests and logs are collated +# +# As of Jul 2025 this takes ~ 15 mins to run. +# +################################################################################ +name: DataSHIELD GHA test suite + +on: + push: + branches: + - master + - v6.3.3-dev + + schedule: + - cron: '0 0 * * 0' # Weekly on master + - cron: '0 1 * * *' # Nightly on v6.3.3-dev + +jobs: + run_devtools_check: + runs-on: ubuntu-latest + timeout-minutes: 120 + + # These should all be constant, except test_filter. This can be used to test + # subsets of test files in the testthat directory. Options are like: + # '*' <- Run all tests. + # 'asNumericDS*' <- Run all asNumericDS tests, i.e. all the arg, etc. tests. + # '*_smk_*' <- Run all the smoke tests for all functions. + env: + test_filter: '*' + _r_check_system_clock_: 0 + datetime: ${{ github.run_id }}-${{ github.run_attempt }} + projectName: dsBase + branchName: ${{ github.ref_name }} + + steps: + - name: Checkout dsBase + uses: actions/checkout@v4 + with: + path: dsBase + + - name: Checkout testStatus + uses: actions/checkout@v4 + with: + repository: datashield/testStatus + token: ${{ secrets.TESTSTATUS_TOKEN }} + ref: master + path: testStatus + + - name: Tweak local R env + run: | + echo "options(Ncpus=4)" >> ~/.Rprofile + + - name: Install R and dependencies + run: | + sudo apt-get update -qq + sudo apt-get install --no-install-recommends software-properties-common dirmngr -y + wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc + sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" + sudo apt-get update -qq + sudo apt-get upgrade -qq + sudo apt-get install -qq \ + pkg-config libxml2-dev libcurl4-openssl-dev libssl-dev libgit2-dev \ + libharfbuzz-dev libfribidi-dev libfontconfig1-dev libfreetype6-dev \ + libpng-dev libtiff5-dev libjpeg-dev r-base -y + sudo R -e "install.packages(c('devtools','RANN','stringr','lme4','dplyr','reshape2','polycor','splines','gamlss','gamlss.dist','mice','childsds'), dependencies=TRUE)" + + - name: Check man files up-to-date + run: | + orig_sum=$(find man -type f | sort -u | xargs cat | md5sum) + R -e "devtools::document()" + new_sum=$(find man -type f | sort -u | xargs cat | md5sum) + if [ "$orig_sum" != "$new_sum" ]; then + echo "Your committed manual files (man/*.Rd) are out of sync with the R files. Run devtools::document() locally then commit." + exit 1 + else + echo "Documentation up-to-date." + fi + working-directory: dsBase + continue-on-error: true + + - name: Run devtools::check + run: | + R -q -e "library('devtools'); devtools::check(args = c('--no-tests', '--no-examples'))" | tee check.Rout + grep -q "^0 errors" check.Rout && grep -q " 0 warnings" check.Rout && grep -q " 0 notes" check.Rout + working-directory: dsBase + continue-on-error: true + + - name: Run tests with coverage & JUnit report + run: | + mkdir -p logs + sudo R --verbose -e 'devtools::reload()' + sudo R -q -e ' + library(covr); + write.csv( + coverage_to_list( + covr::package_coverage( + type = c("none"), + code = c( + '"'"'library(testthat); + output_file <- file("test_console_output.txt"); + sink(output_file); + sink(output_file, type = "message"); + junit_rep <- JunitReporter$new(file = "test_results.xml"); + progress_rep <- ProgressReporter$new(max_failures = 999999); + multi_rep <- MultiReporter$new(reporters = list(progress_rep, junit_rep)); + testthat::test_package("${{ env.projectName }}", filter = "${{ env.test_filter }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' + ) + ) + ), + "coveragelist.csv" + )' + mv coveragelist.csv logs/ + mv test_results.xml logs/ + mv test_console_output.txt logs/ + grep -q " FAIL 0 " logs/test_console_output.txt + working-directory: dsBase + + - name: Check for JUnit errors + run: | + issue_count=$(sed 's/failures="0" errors="0"//' test_results.xml | grep -c errors= || true) + echo "Number of testsuites with issues: $issue_count" + sed 's/failures="0" errors="0"//' test_results.xml | grep errors= > issues.log || true + cat issues.log || true + exit $issue_count + working-directory: dsBase/logs + + - name: Write versions to file + run: | + echo "branch:${{ env.branchName }}" > ${{ env.datetime }}.txt + echo "os:$(lsb_release -ds)" >> ${{ env.datetime }}.txt + echo "R:$(R --version | head -n1)" >> ${{ env.datetime }}.txt + working-directory: dsBase/logs + + - name: Commit results to testStatus + if: github.repository == 'datashield/dsBase' && github.event_name != 'pull_request' + run: | + git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" + git config --global user.name "GitHub Actions" + cd testStatus + git checkout master + git pull + + mkdir -p logs/${{ env.projectName }}/${{ env.branchName }} + mkdir -p docs/${{ env.projectName }}/${{ env.branchName }}/latest + + cp ../dsBase/logs/coveragelist.csv logs/${{ env.projectName }}/${{ env.branchName }}/ + cp ../dsBase/logs/test_results.xml logs/${{ env.projectName }}/${{ env.branchName }}/ + cp ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ + + # Run status.py script here if applicable + # e.g. source/status.py logs/... logs/... status.html ... + + git add . + git commit -m "Auto test for ${{ env.projectName }}/${{ env.branchName }} @ ${{ env.datetime }}" + git push + + - name: Dump environment info + run: | + echo -e "\n#############################" + echo -e "ls /: ######################" + ls -al . + echo -e "\n#############################" + echo -e "lscpu: ######################" + lscpu + echo -e "\n#############################" + echo -e "memory: #####################" + free -m + echo -e "\n#############################" + echo -e "env: ########################" + env + echo -e "\n#############################" + echo -e "R sessionInfo(): ############" + R -e 'sessionInfo()' + sudo apt install tree -y + tree . + From 1a24b756e9d5a5316d84b7ffc9d459bfa0a5f90d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 21 Jul 2025 16:26:37 +0100 Subject: [PATCH 014/148] Update token variable name --- .github/workflows/R-CMD-check-source.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 2f53f446..ed453fc2 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v4 with: repository: datashield/testStatus - token: ${{ secrets.TESTSTATUS_TOKEN }} + token: ${{ secrets.DATASHIELD_DEV }} ref: master path: testStatus From 74a120b7f125284bf56279f7e03a4d27f2b6d4b1 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 09:32:16 +0100 Subject: [PATCH 015/148] Replace test_package call by test_local --- .github/workflows/R-CMD-check-source.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index ed453fc2..1d49b3d4 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -112,7 +112,7 @@ jobs: junit_rep <- JunitReporter$new(file = "test_results.xml"); progress_rep <- ProgressReporter$new(max_failures = 999999); multi_rep <- MultiReporter$new(reporters = list(progress_rep, junit_rep)); - testthat::test_package("${{ env.projectName }}", filter = "${{ env.test_filter }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' + testthat::test_local(filter = "${{ env.test_filter }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' ) ) ), From 408a736b1e928c9c9d296682bd630d7a3153a49e Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 11:51:41 +0100 Subject: [PATCH 016/148] Use r-lib custom actions to setup deployment environment and customise the location of logs --- .github/workflows/R-CMD-check-source.yaml | 49 ++++++++++------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 1d49b3d4..95e26eca 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -55,24 +55,19 @@ jobs: ref: master path: testStatus - - name: Tweak local R env - run: | - echo "options(Ncpus=4)" >> ~/.Rprofile + - uses: r-lib/actions/setup-pandoc@v2 - - name: Install R and dependencies - run: | - sudo apt-get update -qq - sudo apt-get install --no-install-recommends software-properties-common dirmngr -y - wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc - sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" - sudo apt-get update -qq - sudo apt-get upgrade -qq - sudo apt-get install -qq \ - pkg-config libxml2-dev libcurl4-openssl-dev libssl-dev libgit2-dev \ - libharfbuzz-dev libfribidi-dev libfontconfig1-dev libfreetype6-dev \ - libpng-dev libtiff5-dev libjpeg-dev r-base -y - sudo R -e "install.packages(c('devtools','RANN','stringr','lme4','dplyr','reshape2','polycor','splines','gamlss','gamlss.dist','mice','childsds'), dependencies=TRUE)" + - uses: r-lib/actions/setup-r@v2 + with: + r-version: release + http-user-agent: release + use-public-rspm: true + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + - name: Check man files up-to-date run: | orig_sum=$(find man -type f | sort -u | xargs cat | md5sum) @@ -89,14 +84,14 @@ jobs: - name: Run devtools::check run: | - R -q -e "library('devtools'); devtools::check(args = c('--no-tests', '--no-examples'))" | tee check.Rout - grep -q "^0 errors" check.Rout && grep -q " 0 warnings" check.Rout && grep -q " 0 notes" check.Rout + R -q -e "library('devtools'); devtools::check(args = c('--no-tests', '--no-examples'))" | tee ../check.Rout + grep -q "^0 errors" ../check.Rout && grep -q " 0 warnings" ../check.Rout && grep -q " 0 notes" ../check.Rout working-directory: dsBase continue-on-error: true - name: Run tests with coverage & JUnit report run: | - mkdir -p logs + mkdir -p ../logs sudo R --verbose -e 'devtools::reload()' sudo R -q -e ' library(covr); @@ -118,9 +113,9 @@ jobs: ), "coveragelist.csv" )' - mv coveragelist.csv logs/ - mv test_results.xml logs/ - mv test_console_output.txt logs/ + + mv coveragelist.csv ../logs/ + mv test_* ../logs/ grep -q " FAIL 0 " logs/test_console_output.txt working-directory: dsBase @@ -131,14 +126,14 @@ jobs: sed 's/failures="0" errors="0"//' test_results.xml | grep errors= > issues.log || true cat issues.log || true exit $issue_count - working-directory: dsBase/logs + working-directory: logs - name: Write versions to file run: | echo "branch:${{ env.branchName }}" > ${{ env.datetime }}.txt echo "os:$(lsb_release -ds)" >> ${{ env.datetime }}.txt echo "R:$(R --version | head -n1)" >> ${{ env.datetime }}.txt - working-directory: dsBase/logs + working-directory: logs - name: Commit results to testStatus if: github.repository == 'datashield/dsBase' && github.event_name != 'pull_request' @@ -152,9 +147,9 @@ jobs: mkdir -p logs/${{ env.projectName }}/${{ env.branchName }} mkdir -p docs/${{ env.projectName }}/${{ env.branchName }}/latest - cp ../dsBase/logs/coveragelist.csv logs/${{ env.projectName }}/${{ env.branchName }}/ - cp ../dsBase/logs/test_results.xml logs/${{ env.projectName }}/${{ env.branchName }}/ - cp ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ + cp logs/coveragelist.csv logs/${{ env.projectName }}/${{ env.branchName }}/ + cp logs/test_results.xml logs/${{ env.projectName }}/${{ env.branchName }}/ + cp logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From 06daac3984e9313b452a7fdc1930b7e1439d3357 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 12:00:21 +0100 Subject: [PATCH 017/148] Install missing package to run checks and tests --- .github/workflows/R-CMD-check-source.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 95e26eca..0135e808 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -65,7 +65,11 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - extra-packages: any::rcmdcheck + extra-packages: | + any::rcmdcheck + cran::covr + cran::devtools + cran::testthat needs: check - name: Check man files up-to-date From 4ead1cfc1259cd7d4e70d818753863c7615cd416 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 13:06:14 +0100 Subject: [PATCH 018/148] Add missing environment variable --- .github/workflows/R-CMD-check-source.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 0135e808..7cd7d164 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -40,6 +40,8 @@ jobs: datetime: ${{ github.run_id }}-${{ github.run_attempt }} projectName: dsBase branchName: ${{ github.ref_name }} + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes steps: - name: Checkout dsBase From a4f0077d45f6aaf44ad4ba511d69073b5c761275 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 13:20:37 +0100 Subject: [PATCH 019/148] Add step with new approach to install devtools --- .github/workflows/R-CMD-check-source.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 7cd7d164..46fe2952 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -74,6 +74,13 @@ jobs: cran::testthat needs: check + - name: Install dependencies + run: | + install.packages('devtools') + install.packages('remotes') + remotes::install_deps(dependencies = TRUE) + shell: Rscript {0} + - name: Check man files up-to-date run: | orig_sum=$(find man -type f | sort -u | xargs cat | md5sum) From d66c37ac540d1631416ad45211b9cb6fab8e54cd Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 13:37:39 +0100 Subject: [PATCH 020/148] Add missing workind directory --- .github/workflows/R-CMD-check-source.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 46fe2952..bbe5c171 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -69,17 +69,16 @@ jobs: with: extra-packages: | any::rcmdcheck - cran::covr - cran::devtools - cran::testthat needs: check - name: Install dependencies run: | + list.files('.') install.packages('devtools') install.packages('remotes') remotes::install_deps(dependencies = TRUE) shell: Rscript {0} + working-directory: dsBase - name: Check man files up-to-date run: | From a8269e58951541d8d96843ecbc1f47b679be273f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 13:50:17 +0100 Subject: [PATCH 021/148] Simplify workflow removing unnecessary step --- .github/workflows/R-CMD-check-source.yaml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index bbe5c171..9baa59d6 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -69,17 +69,9 @@ jobs: with: extra-packages: | any::rcmdcheck + cran::devtools needs: check - - name: Install dependencies - run: | - list.files('.') - install.packages('devtools') - install.packages('remotes') - remotes::install_deps(dependencies = TRUE) - shell: Rscript {0} - working-directory: dsBase - - name: Check man files up-to-date run: | orig_sum=$(find man -type f | sort -u | xargs cat | md5sum) @@ -104,8 +96,8 @@ jobs: - name: Run tests with coverage & JUnit report run: | mkdir -p ../logs - sudo R --verbose -e 'devtools::reload()' - sudo R -q -e ' + R -q -e "library('devtools'); devtools::reload();"" + R -q -e ' library(covr); write.csv( coverage_to_list( From f4893025ea272d9d62e96dbf23c2d6465f6305ca Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 14:01:45 +0100 Subject: [PATCH 022/148] Remove additional double quote mark --- .github/workflows/R-CMD-check-source.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 9baa59d6..abdf22ff 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -96,7 +96,7 @@ jobs: - name: Run tests with coverage & JUnit report run: | mkdir -p ../logs - R -q -e "library('devtools'); devtools::reload();"" + R -q -e "library('devtools'); devtools::reload();" R -q -e ' library(covr); write.csv( From 7a81c04c98bcdc656590899406a3b54bd7a27ab5 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 14:17:20 +0100 Subject: [PATCH 023/148] Ammend wrong file path and add commands to check current file tree --- .github/workflows/R-CMD-check-source.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index abdf22ff..4f9945ad 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -117,10 +117,14 @@ jobs: ), "coveragelist.csv" )' - + + echo '========== . =========' + ls . + echo '========== .. =========' + ls .. mv coveragelist.csv ../logs/ mv test_* ../logs/ - grep -q " FAIL 0 " logs/test_console_output.txt + grep -q " FAIL 0 " ../logs/test_console_output.txt working-directory: dsBase - name: Check for JUnit errors From a21b0c4074df2570e0a81c6ac6971a1c25e00020 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 14:36:11 +0100 Subject: [PATCH 024/148] Replace the location of testStatus for development purposes --- .github/workflows/R-CMD-check-source.yaml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 4f9945ad..27e22931 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -52,7 +52,7 @@ jobs: - name: Checkout testStatus uses: actions/checkout@v4 with: - repository: datashield/testStatus + repository: villegar/testStatus token: ${{ secrets.DATASHIELD_DEV }} ref: master path: testStatus @@ -118,10 +118,6 @@ jobs: "coveragelist.csv" )' - echo '========== . =========' - ls . - echo '========== .. =========' - ls .. mv coveragelist.csv ../logs/ mv test_* ../logs/ grep -q " FAIL 0 " ../logs/test_console_output.txt @@ -144,7 +140,7 @@ jobs: working-directory: logs - name: Commit results to testStatus - if: github.repository == 'datashield/dsBase' && github.event_name != 'pull_request' + if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' run: | git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" git config --global user.name "GitHub Actions" From f5ac4bcc47d2842e1fd0429ca2ae919681a94f8f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 14:37:39 +0100 Subject: [PATCH 025/148] Update path ../logs >>> logs --- .github/workflows/R-CMD-check-source.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 27e22931..ac2d94e8 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -95,7 +95,7 @@ jobs: - name: Run tests with coverage & JUnit report run: | - mkdir -p ../logs + mkdir -p logs R -q -e "library('devtools'); devtools::reload();" R -q -e ' library(covr); @@ -118,9 +118,9 @@ jobs: "coveragelist.csv" )' - mv coveragelist.csv ../logs/ - mv test_* ../logs/ - grep -q " FAIL 0 " ../logs/test_console_output.txt + mv coveragelist.csv logs/ + mv test_* logs/ + grep -q " FAIL 0 " logs/test_console_output.txt working-directory: dsBase - name: Check for JUnit errors From 5d2c5cd816162322b952fd7912d4c196e1a665d9 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 14:46:34 +0100 Subject: [PATCH 026/148] Update working directories --- .github/workflows/R-CMD-check-source.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index ac2d94e8..18957add 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -130,14 +130,14 @@ jobs: sed 's/failures="0" errors="0"//' test_results.xml | grep errors= > issues.log || true cat issues.log || true exit $issue_count - working-directory: logs + working-directory: dsBase/logs - name: Write versions to file run: | echo "branch:${{ env.branchName }}" > ${{ env.datetime }}.txt echo "os:$(lsb_release -ds)" >> ${{ env.datetime }}.txt echo "R:$(R --version | head -n1)" >> ${{ env.datetime }}.txt - working-directory: logs + working-directory: dsBase/logs - name: Commit results to testStatus if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' From 4cfa058ca4ca290f89b5f2b4829dd12c63bab3c8 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 15:04:24 +0100 Subject: [PATCH 027/148] Update git config command and paths to local files --- .github/workflows/R-CMD-check-source.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/R-CMD-check-source.yaml index 18957add..791b35e3 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/R-CMD-check-source.yaml @@ -142,7 +142,7 @@ jobs: - name: Commit results to testStatus if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' run: | - git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" + git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com" git config --global user.name "GitHub Actions" cd testStatus git checkout master @@ -151,9 +151,9 @@ jobs: mkdir -p logs/${{ env.projectName }}/${{ env.branchName }} mkdir -p docs/${{ env.projectName }}/${{ env.branchName }}/latest - cp logs/coveragelist.csv logs/${{ env.projectName }}/${{ env.branchName }}/ - cp logs/test_results.xml logs/${{ env.projectName }}/${{ env.branchName }}/ - cp logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ + cp ../dsBase/logs/*.csv logs/${{ env.projectName }}/${{ env.branchName }}/ + cp ../dsBase/logs/*.xml logs/${{ env.projectName }}/${{ env.branchName }}/ + cp ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From b87295090090ab74771393a30003b9af2c947730 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 15:15:17 +0100 Subject: [PATCH 028/148] Rename workflow and update documentation --- ...R-CMD-check-source.yaml => dsBase_test_suite.yaml} | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) rename .github/workflows/{R-CMD-check-source.yaml => dsBase_test_suite.yaml} (97%) diff --git a/.github/workflows/R-CMD-check-source.yaml b/.github/workflows/dsBase_test_suite.yaml similarity index 97% rename from .github/workflows/R-CMD-check-source.yaml rename to .github/workflows/dsBase_test_suite.yaml index 791b35e3..d547ab57 100644 --- a/.github/workflows/R-CMD-check-source.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -1,18 +1,15 @@ ################################################################################ # DataSHIELD GHA test suite - dsBase # Adapted from `azure-pipelines.yml` by Roberto Villegas-Diaz -# -# OVERVIEW # # Inside the root directory $(Pipeline.Workspace) will be a file tree like: # /dsBase <- Checked out version of datashield/dsBase +# /dsBase/logs <- Where results of tests and logs are collated # /testStatus <- Checked out version of datashield/testStatus -# /logs <- Where results of tests and logs are collated -# -# As of Jul 2025 this takes ~ 15 mins to run. # +# As of Jul 2025 this takes ~ 9 mins to run. ################################################################################ -name: DataSHIELD GHA test suite +name: DataSHIELD GHA test suite for dsBase on: push: @@ -25,7 +22,7 @@ on: - cron: '0 1 * * *' # Nightly on v6.3.3-dev jobs: - run_devtools_check: + dsBase_test_suite: runs-on: ubuntu-latest timeout-minutes: 120 From 0b8a9c6a8703e387d867f8ab0d9df92493464a3a Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 16:12:18 +0100 Subject: [PATCH 029/148] Add recursive and verbose flags to cp command --- .github/workflows/dsBase_test_suite.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index d547ab57..5546eeb9 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -148,9 +148,9 @@ jobs: mkdir -p logs/${{ env.projectName }}/${{ env.branchName }} mkdir -p docs/${{ env.projectName }}/${{ env.branchName }}/latest - cp ../dsBase/logs/*.csv logs/${{ env.projectName }}/${{ env.branchName }}/ - cp ../dsBase/logs/*.xml logs/${{ env.projectName }}/${{ env.branchName }}/ - cp ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ + cp -rv ../dsBase/logs/*.csv logs/${{ env.projectName }}/${{ env.branchName }}/ + cp -rv ../dsBase/logs/*.xml logs/${{ env.projectName }}/${{ env.branchName }}/ + cp -rv ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From b8c437d5cb5a8f17daaaec7d302ec380a746034e Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 22 Jul 2025 16:38:08 +0100 Subject: [PATCH 030/148] Simplify copying command for log files --- .github/workflows/dsBase_test_suite.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 5546eeb9..3bfefcee 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -148,8 +148,7 @@ jobs: mkdir -p logs/${{ env.projectName }}/${{ env.branchName }} mkdir -p docs/${{ env.projectName }}/${{ env.branchName }}/latest - cp -rv ../dsBase/logs/*.csv logs/${{ env.projectName }}/${{ env.branchName }}/ - cp -rv ../dsBase/logs/*.xml logs/${{ env.projectName }}/${{ env.branchName }}/ + cp -rv ../dsBase/logs/* logs/${{ env.projectName }}/${{ env.branchName }}/ cp -rv ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ # Run status.py script here if applicable From a51f6817e9ee8b0fa43cae7d323acf2f81a1608f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 09:18:48 +0100 Subject: [PATCH 031/148] Update user.name for git push --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 3bfefcee..edc4fa78 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -140,7 +140,7 @@ jobs: if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' run: | git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com" - git config --global user.name "GitHub Actions" + git config --global user.name "$GITHUB_ACTOR" cd testStatus git checkout master git pull From d961ac06f174d7cd7f7bc53c9d10cdb9f3b94bc8 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 09:21:55 +0100 Subject: [PATCH 032/148] Rename branchName >> BRANCH_NAME --- .github/workflows/dsBase_test_suite.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index edc4fa78..e9ed8de3 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -36,7 +36,7 @@ jobs: _r_check_system_clock_: 0 datetime: ${{ github.run_id }}-${{ github.run_attempt }} projectName: dsBase - branchName: ${{ github.ref_name }} + BRANCH_NAME: ${{ github.ref_name }} GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes @@ -131,7 +131,7 @@ jobs: - name: Write versions to file run: | - echo "branch:${{ env.branchName }}" > ${{ env.datetime }}.txt + echo "branch:${{ env.BRANCH_NAME }}" > ${{ env.datetime }}.txt echo "os:$(lsb_release -ds)" >> ${{ env.datetime }}.txt echo "R:$(R --version | head -n1)" >> ${{ env.datetime }}.txt working-directory: dsBase/logs @@ -145,17 +145,17 @@ jobs: git checkout master git pull - mkdir -p logs/${{ env.projectName }}/${{ env.branchName }} - mkdir -p docs/${{ env.projectName }}/${{ env.branchName }}/latest + mkdir -p logs/${{ env.projectName }}/${{ env.BRANCH_NAME }} + mkdir -p docs/${{ env.projectName }}/${{ env.BRANCH_NAME }}/latest - cp -rv ../dsBase/logs/* logs/${{ env.projectName }}/${{ env.branchName }}/ - cp -rv ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.branchName }}/ + cp -rv ../dsBase/logs/* logs/${{ env.projectName }}/${{ env.BRANCH_NAME }}/ + cp -rv ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.BRANCH_NAME }}/ # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... git add . - git commit -m "Auto test for ${{ env.projectName }}/${{ env.branchName }} @ ${{ env.datetime }}" + git commit -m "Auto test for ${{ env.projectName }}/${{ env.BRANCH_NAME }} @ ${{ env.datetime }}" git push - name: Dump environment info From 2c11650804968ced0a6f8a4124edffba32497883 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 09:26:47 +0100 Subject: [PATCH 033/148] Rename environment variables from cammel case to all upper case and add new REPO_OWNER variable --- .github/workflows/dsBase_test_suite.yaml | 33 ++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index e9ed8de3..58c1a2b2 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -26,17 +26,18 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 - # These should all be constant, except test_filter. This can be used to test + # These should all be constant, except TEST_FILTER. This can be used to test # subsets of test files in the testthat directory. Options are like: # '*' <- Run all tests. # 'asNumericDS*' <- Run all asNumericDS tests, i.e. all the arg, etc. tests. # '*_smk_*' <- Run all the smoke tests for all functions. env: - test_filter: '*' + TEST_FILTER: '*' _r_check_system_clock_: 0 - datetime: ${{ github.run_id }}-${{ github.run_attempt }} - projectName: dsBase + DATETIME: ${{ github.run_id }}-${{ github.run_attempt }} + PROJECT_NAME: dsBase BRANCH_NAME: ${{ github.ref_name }} + REPO_OWNER: ${{ github.repository_owner }} GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes @@ -49,8 +50,8 @@ jobs: - name: Checkout testStatus uses: actions/checkout@v4 with: - repository: villegar/testStatus - token: ${{ secrets.DATASHIELD_DEV }} + repository: ${{ env.REPO_OWNER }}/testStatus + token: ${{ secrets.GITHUB_TOKEN }} ref: master path: testStatus @@ -108,7 +109,7 @@ jobs: junit_rep <- JunitReporter$new(file = "test_results.xml"); progress_rep <- ProgressReporter$new(max_failures = 999999); multi_rep <- MultiReporter$new(reporters = list(progress_rep, junit_rep)); - testthat::test_local(filter = "${{ env.test_filter }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' + testthat::test_local(filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' ) ) ), @@ -131,13 +132,13 @@ jobs: - name: Write versions to file run: | - echo "branch:${{ env.BRANCH_NAME }}" > ${{ env.datetime }}.txt - echo "os:$(lsb_release -ds)" >> ${{ env.datetime }}.txt - echo "R:$(R --version | head -n1)" >> ${{ env.datetime }}.txt + echo "branch:${{ env.BRANCH_NAME }}" > ${{ env.DATETIME }}.txt + echo "os:$(lsb_release -ds)" >> ${{ env.DATETIME }}.txt + echo "R:$(R --version | head -n1)" >> ${{ env.DATETIME }}.txt working-directory: dsBase/logs - name: Commit results to testStatus - if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' + # if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' run: | git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com" git config --global user.name "$GITHUB_ACTOR" @@ -145,17 +146,17 @@ jobs: git checkout master git pull - mkdir -p logs/${{ env.projectName }}/${{ env.BRANCH_NAME }} - mkdir -p docs/${{ env.projectName }}/${{ env.BRANCH_NAME }}/latest + mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest - cp -rv ../dsBase/logs/* logs/${{ env.projectName }}/${{ env.BRANCH_NAME }}/ - cp -rv ../dsBase/logs/${{ env.datetime }}.txt logs/${{ env.projectName }}/${{ env.BRANCH_NAME }}/ + cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/ + cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/ # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... git add . - git commit -m "Auto test for ${{ env.projectName }}/${{ env.BRANCH_NAME }} @ ${{ env.datetime }}" + git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.DATETIME }}" git push - name: Dump environment info From b5eada4cc010e572db229ad467b888a8a5ca1c3b Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 09:47:07 +0100 Subject: [PATCH 034/148] Ammend token secret variable name and structure of files --- .github/workflows/dsBase_test_suite.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 58c1a2b2..cf2a310e 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.DATASHIELD_DEV }} ref: master path: testStatus @@ -146,11 +146,14 @@ jobs: git checkout master git pull - mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest - - cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/ - cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/ + mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ + + # Copy logs to new logs directory location + cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ + cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ + + # Create symbolic link + ln -sf logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/[latest] # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From 9a47b4d46a6c1bb7eaca9163b340a26d1c165ce6 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 10:01:37 +0100 Subject: [PATCH 035/148] Update location of symbolic link --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index cf2a310e..eaa433d9 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -153,7 +153,7 @@ jobs: cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ # Create symbolic link - ln -sf logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/[latest] + ln -sf logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/[latest] # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From 668041180346aa3af72dafcaac643e6e2c9ed5e2 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 10:12:41 +0100 Subject: [PATCH 036/148] Test a new way to get GitHub authentication token --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index eaa433d9..f28b6fdd 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ secrets.DATASHIELD_DEV }} + token: ${{ github.token }} ref: master path: testStatus From 4023d0376e0649cf751fec80aa9d515a2de454db Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 11:28:31 +0100 Subject: [PATCH 037/148] Revert to secrets.DATASHIELD_DEV for token --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index f28b6fdd..eaa433d9 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ github.token }} + token: ${{ secrets.DATASHIELD_DEV }} ref: master path: testStatus From 152de9bf0b215d30bf469df33e910ef437fcd2a4 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:01:34 +0100 Subject: [PATCH 038/148] Change function call for tests: testthat::test_local >> testthat::test_package --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index eaa433d9..2ceb0907 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -109,7 +109,7 @@ jobs: junit_rep <- JunitReporter$new(file = "test_results.xml"); progress_rep <- ProgressReporter$new(max_failures = 999999); multi_rep <- MultiReporter$new(reporters = list(progress_rep, junit_rep)); - testthat::test_local(filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' + testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' ) ) ), From 678940b201abf468720a20494c277065f1c96609 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:08:05 +0100 Subject: [PATCH 039/148] Add GHA workflow for deployment of package documentation website generated with pkgdown --- .github/workflows/pkgdown.yaml | 49 ++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/pkgdown.yaml diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 00000000..bfc9f4db --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,49 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + release: + types: [published] + workflow_dispatch: + +name: pkgdown.yaml + +permissions: read-all + +jobs: + pkgdown: + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::pkgdown, local::. + needs: website + + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages 🚀 + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4.5.0 + with: + clean: false + branch: gh-pages + folder: docs From 8297d11d0e4e4cef0ea548c321fb5c619201e776 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:19:16 +0100 Subject: [PATCH 040/148] Update run tests step to remove direct calls to library --- .github/workflows/dsBase_test_suite.yaml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 2ceb0907..18e97edc 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -96,26 +96,25 @@ jobs: mkdir -p logs R -q -e "library('devtools'); devtools::reload();" R -q -e ' - library(covr); write.csv( - coverage_to_list( + covr::coverage_to_list( covr::package_coverage( type = c("none"), - code = c( - '"'"'library(testthat); + code = c(' output_file <- file("test_console_output.txt"); sink(output_file); sink(output_file, type = "message"); - junit_rep <- JunitReporter$new(file = "test_results.xml"); - progress_rep <- ProgressReporter$new(max_failures = 999999); - multi_rep <- MultiReporter$new(reporters = list(progress_rep, junit_rep)); - testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' + junit_rep <- testthat::JunitReporter$new(file = "test_results.xml"); + progress_rep <- testthat::ProgressReporter$new(max_failures = 999999); + multi_rep <- testthat::MultiReporter$new(reporters = list(progress_rep, junit_rep)); + testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)' ) ) ), "coveragelist.csv" )' + ls * mv coveragelist.csv logs/ mv test_* logs/ grep -q " FAIL 0 " logs/test_console_output.txt From d1e27c38e3191864c1c9b150bb3812269be7a055 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:28:07 +0100 Subject: [PATCH 041/148] Fix quotation marks --- .github/workflows/dsBase_test_suite.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 18e97edc..9bfaea6e 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -100,14 +100,14 @@ jobs: covr::coverage_to_list( covr::package_coverage( type = c("none"), - code = c(' - output_file <- file("test_console_output.txt"); + code = c(" + output_file <- file('test_console_output.txt'); sink(output_file); - sink(output_file, type = "message"); - junit_rep <- testthat::JunitReporter$new(file = "test_results.xml"); + sink(output_file, type = 'message'); + junit_rep <- testthat::JunitReporter$new(file = 'test_results.xml'); progress_rep <- testthat::ProgressReporter$new(max_failures = 999999); multi_rep <- testthat::MultiReporter$new(reporters = list(progress_rep, junit_rep)); - testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)' + testthat::test_package('${{ env.PROJECT_NAME }}', filter = '${{ env.TEST_FILTER }}', reporter = multi_rep, stop_on_failure = FALSE)'" ) ) ), From d755066a951bcd9bbd3ff96a973109186274a5c4 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:36:20 +0100 Subject: [PATCH 042/148] Revert changes with single/double quotes surrounding code snip --- .github/workflows/dsBase_test_suite.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 9bfaea6e..26264c83 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -94,20 +94,20 @@ jobs: - name: Run tests with coverage & JUnit report run: | mkdir -p logs - R -q -e "library('devtools'); devtools::reload();" + R -q -e "devtools::reload();" R -q -e ' write.csv( covr::coverage_to_list( covr::package_coverage( type = c("none"), - code = c(" - output_file <- file('test_console_output.txt'); + code = c('"'"' + output_file <- file("test_console_output.txt"); sink(output_file); - sink(output_file, type = 'message'); - junit_rep <- testthat::JunitReporter$new(file = 'test_results.xml'); + sink(output_file, type = "message"); + junit_rep <- testthat::JunitReporter$new(file = "test_results.xml"); progress_rep <- testthat::ProgressReporter$new(max_failures = 999999); multi_rep <- testthat::MultiReporter$new(reporters = list(progress_rep, junit_rep)); - testthat::test_package('${{ env.PROJECT_NAME }}', filter = '${{ env.TEST_FILTER }}', reporter = multi_rep, stop_on_failure = FALSE)'" + testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' ) ) ), From e41608d42417998720a314d7bd32f6b4b2c0a522 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:40:29 +0100 Subject: [PATCH 043/148] Regenerate documentation with pkgdown::build_site() --- docs/authors.html | 54 ++++++++++++++++-- docs/index.html | 57 ++++++++++++++----- docs/pkgdown.yml | 4 +- docs/reference/BooleDS.html | 7 ++- docs/reference/asFactorDS2.html | 2 +- .../checkPermissivePrivacyControlLevel.html | 10 +++- docs/reference/covDS.html | 2 +- docs/reference/glmDS1.html | 8 ++- docs/reference/glmDS2.html | 8 ++- docs/reference/heatmapPlotDS.html | 2 +- docs/reference/histogramDS1.html | 6 +- docs/reference/histogramDS2.html | 2 +- docs/reference/lexisDS1.html | 8 ++- docs/reference/lexisDS2.html | 8 ++- docs/reference/lexisDS3.html | 4 ++ docs/reference/listDisclosureSettingsDS.html | 4 ++ docs/reference/matrixMultDS.html | 2 +- docs/reference/meanSdGpDS.html | 12 ++-- docs/reference/scatterPlotDS.html | 2 +- docs/reference/subsetDS.html | 14 ++--- docs/reference/table1DDS.html | 2 +- docs/reference/table2DDS.html | 2 +- docs/reference/testObjExistsDS.html | 10 +++- 23 files changed, 172 insertions(+), 58 deletions(-) diff --git a/docs/authors.html b/docs/authors.html index cc06044e..70570f2a 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -88,16 +88,62 @@

Citation

-

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Wheater S (2025). -dsBase: DataSHIELD Server Site Base Functions. +

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Wheater S (????). +dsBase: 'DataSHIELD' Server Site Base Functions. R package version 6.3.3.

@Manual{,
-  title = {dsBase: DataSHIELD Server Site Base Functions},
+  title = {dsBase: 'DataSHIELD' Server Site 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 Stuart Wheater},
-  year = {2025},
   note = {R package version 6.3.3},
 }
+

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, Oliver 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.” +International Journal of Epidemiology, 43(6), 1929–1944. +doi:10.1093/ije/dyu188. +

+
@Article{,
+  title = {{DataSHIELD: taking the analysis to the data, not the data to the analysis}},
+  author = {Amadou Gaye and Yannick Marcon and Julia Isaeva and Philippe {LaFlamme} and Andrew Turner and Elinor M Jones and Joel Minion and Andrew W Boyd and Christopher J Newby and Marja-Liisa Nuotio and Rebecca Wilson and Oliver Butters and Barnaby Murtagh and Ipek Demir and Dany Doiron and Lisette Giepmans and Susan E Wallace and Isabelle Budin-Lj{\o}sne and Carsten {{Oliver Schmidt}} and Paolo Boffetta and Mathieu Boniol and Maria Bota and Kim W Carter and Nick {deKlerk} and Chris Dibben and Richard W Francis and Tero Hiekkalinna and Kristian Hveem and Kirsti Kval{\o}y and Sean Millar and Ivan J Perry and Annette Peters and Catherine M Phillips and Frank Popham and Gillian Raab and Eva Reischl and Nuala Sheehan and Melanie Waldenberger and Markus Perola and Edwin {{van den Heuvel}} and John Macleod and Bartha M Knoppers and Ronald P Stolk and Isabel Fortier and Jennifer R Harris and Bruce H R Woffenbuttel and Madeleine J Murtagh and Vincent Ferretti and Paul R Burton},
+  journal = {International Journal of Epidemiology},
+  year = {2014},
+  volume = {43},
+  number = {6},
+  pages = {1929--1944},
+  doi = {10.1093/ije/dyu188},
+}
+

Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, R. Burton P (2017). +“DataSHIELD – New Directions and Dimensions.” +Data Science Journal, 16(21), 1–21. +doi:10.5334/dsj-2017-021. +

+
@Article{,
+  title = {{DataSHIELD – New Directions and Dimensions}},
+  author = {Rebecca C. Wilson and Oliver {W. Butters} and Demetris Avraam and James Baker and Jonathan A. Tedds and Andrew Turner and Madeleine Murtagh and Paul {R. Burton}},
+  journal = {Data Science Journal},
+  year = {2017},
+  volume = {16},
+  number = {21},
+  pages = {1--21},
+  doi = {10.5334/dsj-2017-021},
+}
+

Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Morris AvSwertz, Welten M, Wheater S, Burton P (2024). +“DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” +Bioinformatics Advances, 5(1), 1–21. +doi:10.1093/bioadv/vbaf046. +

+
@Article{,
+  title = {{DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform}},
+  author = {Demetris Avraam and Rebecca C Wilson and Noemi {{Aguirre Chan}} and Soumya Banerjee and Tom R P Bishop and Olly Butters and Tim Cadman and Luise Cederkvist and Liesbeth Duijts and Xavier {{Escrib{\a`a} Montagut}} and Hugh Garner and Gon{\c c}alo {Gon{\c c}alves} and Juan R Gonz{\a'a}lez and Sido Haakma and Mette Hartlev and Jan Hasenauer and Manuel Huth and Eleanor Hyde and Vincent W V Jaddoe and Yannick Marcon and Michaela Th Mayrhofer and Fruzsina Molnar-Gabor and Andrei Scott Morgan and Madeleine Murtagh and Marc Nestor and Anne-Marie {{Nybo Andersen}} and Simon Parker and Angela {{Pinot de Moira}} and Florian Schwarz and Katrine Strandberg-Larsen and {Morris AvSwertz} and Marieke Welten and Stuart Wheater and Paul Burton},
+  journal = {Bioinformatics Advances},
+  year = {2024},
+  volume = {5},
+  number = {1},
+  pages = {1--21},
+  doi = {10.1093/bioadv/vbaf046},
+  editor = {Thomas Lengauer},
+  publisher = {Oxford University Press (OUP)},
+}
diff --git a/docs/index.html b/docs/index.html index 54bbe6e5..ca9ac5a7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -12,7 +12,7 @@ - +

+
+install.packages("remotes")
+remotes::install_github("datashield/dsBase", "<BRANCH>")
+
+# Install v6.4.0 with the following
+remotes::install_github("datashield/dsBase", "v6.4.0-dev")
+

For a full list of development branches, checkout https://github.com/datashield/dsBase/branches

+
+
+

About +

DataSHIELD is a software package which allows you to do non-disclosive federated analysis on sensitive data. Our website (https://www.datashield.org) has in depth descriptions of what it is, how it works and how to install it. A key point to highlight is that DataSHIELD has a client-server infrastructure, so the dsBase package (https://github.com/datashield/dsBase) needs to be used in conjuction with the dsBaseClient package (https://github.com/datashield/dsBaseClient) - trying to use one without the other makes no sense.

Detailed instructions on how to install DataSHIELD are at https://wiki.datashield.org/. The code here is organised as:

@@ -72,31 +86,46 @@

About

- + - + - + - +
Location What is it?
obiba CRAN Where you probably should install DataSHIELD from.
releases Stable releases.
master branch Mostly in sync with the latest release, changes rarely.
+
+
+

References +

+

[1] 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 (2025). dsBase: ‘DataSHIELD’ Server Side Base Functions. R package version 6.3.3. https://doi.org/10.32614/CRAN.package.dsBase.

+

[2] 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, Oliver 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.” International Journal of Epidemiology, 43(6), 1929-1944. https://doi.org/10.1093/ije/dyu188.

+

[3] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, R. Burton P (2017). “DataSHIELD – New Directions and Dimensions.” Data Science Journal, 16(21), 1-21. https://doi.org/10.5334/dsj-2017-021.

+

[4] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Morris AvSwertz, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1-21. https://doi.org/10.1093/bioadv/vbaf046.

-

This is the first serverside aggregate function called by ds.glm

+

This is the first server-side aggregate function called by ds.glm

@@ -75,6 +75,10 @@

Arguments

analysed under the specified model

+
+

Value

+

List with values from GLM model.

+

Details

It is an diff --git a/docs/reference/glmDS2.html b/docs/reference/glmDS2.html index 2cefd28f..0f9df3f4 100644 --- a/docs/reference/glmDS2.html +++ b/docs/reference/glmDS2.html @@ -1,5 +1,5 @@ -glmDS2 called by ds.glm — glmDS2 • dsBaseglmDS2 called by ds.glm — glmDS2 • dsBase @@ -40,7 +40,7 @@

glmDS2 called by ds.glm

-

This is the second serverside aggregate function called by ds.glm.

+

This is the second server-side aggregate function called by ds.glm.

@@ -79,6 +79,10 @@

Arguments

the data to be analysed under the specified model same

+
+

Value

+

List with values from GLM model

+

Details

It is an aggregate function that uses the model structure and starting diff --git a/docs/reference/heatmapPlotDS.html b/docs/reference/heatmapPlotDS.html index eb3715fa..cf9941b6 100644 --- a/docs/reference/heatmapPlotDS.html +++ b/docs/reference/heatmapPlotDS.html @@ -60,7 +60,7 @@

Arguments

k
-

the number of the nearest neghbours for which their centroid is calculated if the +

the number of the nearest neighbours for which their centroid is calculated if the method.indicator is equal to 1 (i.e. deterministic method).

diff --git a/docs/reference/histogramDS1.html b/docs/reference/histogramDS1.html index 59888e26..2a83be22 100644 --- a/docs/reference/histogramDS1.html +++ b/docs/reference/histogramDS1.html @@ -2,7 +2,7 @@ returns the minimum and the maximum of the input numeric vector — histogramDS1 • dsBaselexisDS1 — lexisDS1 • dsBaselexisDS1 — lexisDS1 • dsBase @@ -40,7 +40,7 @@

lexisDS1

-

The first serverside function called by ds.lexis.

+

The first server-side function called by ds.lexis.

@@ -55,6 +55,10 @@

Arguments

a character string specifying the variable holding the time that each individual is censored or fails

+
+

Value

+

List with `max.time`

+

Details

This is an aggregate function. diff --git a/docs/reference/lexisDS2.html b/docs/reference/lexisDS2.html index 39b99d50..89ebeabf 100644 --- a/docs/reference/lexisDS2.html +++ b/docs/reference/lexisDS2.html @@ -78,7 +78,7 @@

Arguments

idCol

a clientside generated character string specifying the variable -holding the IDs of indivuals in the data set to be expanded

+holding the IDs of individuals in the data set to be expanded

entryCol
@@ -103,6 +103,10 @@

Arguments

'data' argument is set the full data.frame will be expanded and carried forward

+
+

Value

+

List with `expanded.table`

+

Details

This is the assign @@ -111,7 +115,7 @@

Details

regression. lexisDS2 also carries out a series of disclosure checks and if the arguments or data fail any of those tests, -creation of the exapanded dataframe is blocked and an appropriate serverside error +creation of the expanded dataframe is blocked and an appropriate serverside error message is stored. For more details see the extensive header for ds.lexis.

diff --git a/docs/reference/lexisDS3.html b/docs/reference/lexisDS3.html index 023ff8e4..dc237cda 100644 --- a/docs/reference/lexisDS3.html +++ b/docs/reference/lexisDS3.html @@ -47,6 +47,10 @@

@title lexisDS3

lexisDS3()
+
+

Value

+

Data frame with `messageobj` object

+

Details

This is an assign function that simplifies the diff --git a/docs/reference/listDisclosureSettingsDS.html b/docs/reference/listDisclosureSettingsDS.html index 10134413..549c94e3 100644 --- a/docs/reference/listDisclosureSettingsDS.html +++ b/docs/reference/listDisclosureSettingsDS.html @@ -49,6 +49,10 @@

listDisclosureSettingsDS

listDisclosureSettingsDS()
+
+

Value

+

List with DataSHIELD disclosure settings

+

Details

For more details see the extensive header for ds.listDisclosureSettings

diff --git a/docs/reference/matrixMultDS.html b/docs/reference/matrixMultDS.html index 6af3ff82..c782eaac 100644 --- a/docs/reference/matrixMultDS.html +++ b/docs/reference/matrixMultDS.html @@ -69,7 +69,7 @@

Value

Details

Undertakes standard matrix multiplication where with input matrices A and B with -dimensions A: mxn and B: nxp the output C has dimensions mxp and each elemnt C[i,j] has +dimensions A: mxn and B: nxp the output C has dimensions mxp and each element C[i,j] has value equal to the dot product of row i of A and column j of B where the dot product is obtained as sum(A[i,1]*B[1,j] + A[i,2]*B[2,j] + .... + A[i,n]*B[n,j]). This calculation is only valid if the number of columns of A is the same as the number of rows of B

diff --git a/docs/reference/meanSdGpDS.html b/docs/reference/meanSdGpDS.html index d60d33d7..7e902552 100644 --- a/docs/reference/meanSdGpDS.html +++ b/docs/reference/meanSdGpDS.html @@ -1,5 +1,5 @@ -MeanSdGpDS — meanSdGpDS • dsBaseMeanSdGpDS — meanSdGpDS • dsBase @@ -40,7 +40,7 @@

MeanSdGpDS

-

Serverside function called by ds.meanSdGp

+

Server-side function called by ds.meanSdGp

@@ -52,15 +52,19 @@

Arguments

X
-

a clientside supplied character string identifying the variable for which +

a client-side supplied character string identifying the variable for which means/SDs are to be calculated

INDEX
-

a clientside supplied character string identifying the factor across +

a client-side supplied character string identifying the factor across which means/SDs are to be calculated

+
+

Value

+

List with results from the group statistics

+

Details

Computes the mean and standard deviation across groups defined by one diff --git a/docs/reference/scatterPlotDS.html b/docs/reference/scatterPlotDS.html index b1298f5d..2e3d5407 100644 --- a/docs/reference/scatterPlotDS.html +++ b/docs/reference/scatterPlotDS.html @@ -68,7 +68,7 @@

Arguments

k
-

the number of the nearest neghbours for which their centroid is calculated if the +

the number of the nearest neighbours for which their centroid is calculated if the deterministic method is selected.

diff --git a/docs/reference/subsetDS.html b/docs/reference/subsetDS.html index 8bc2f861..19e73aab 100644 --- a/docs/reference/subsetDS.html +++ b/docs/reference/subsetDS.html @@ -1,7 +1,7 @@ Generates a valid subset of a table or a vector — subsetDS • dsBase @@ -43,8 +43,8 @@

Generates a valid subset of a table or a vector

The function uses the R classical subsetting with squared brackets '[]' and allows also to -subset using a logical oprator and a threshold. The object to subset from must be a vector (factor, numeric -or charcater) or a table (data.frame or matrix).

+subset using a logical operator and a threshold. The object to subset from must be a vector (factor, numeric +or character) or a table (data.frame or matrix).

@@ -92,18 +92,18 @@

Arguments

varname

a character, if the input data is a table, if this parameter is provided along with the 'logical' and 'threshold' -parameters, a subtable is based the threshold applied to the speicified variable. This parameter is however ignored if the parameter +parameters, a subtable is based the threshold applied to the specified variable. This parameter is however ignored if the parameter 'rows' and/or 'cols' are provided.

Value

-

a subset of the vector, matric or dataframe as specified is stored on the server side

+

a subset of the vector, matrix or dataframe as specified is stored on the server side

Details

If the input data is a table: The user specifies the rows and/or columns to include in the subset if the input -object is a table; the columns can be refered to by their names. The name of a vector (i.e. a variable) can also be provided +object is a table; the columns can be referred to by their names. The name of a vector (i.e. a variable) can also be provided with a logical operator and a threshold (see example 3). If the input data is a vector: when the parameters 'rows', 'logical' and 'threshold' are all provided the last two are ignored ( 'rows' has precedence over the other two parameters then). diff --git a/docs/reference/table1DDS.html b/docs/reference/table1DDS.html index 6796312e..82d157f7 100644 --- a/docs/reference/table1DDS.html +++ b/docs/reference/table1DDS.html @@ -65,7 +65,7 @@

Value

Details

It generates a 1-dimensional tables where valid (non-disclosive) 1-dimensional tables are defined -as data from sources where no table cells have counts between 1 and the set threshold. When the ouput table +as data from sources where no table cells have counts between 1 and the set threshold. When the output table is invalid all cells but the total count are replaced by missing values. Only the total count is visible on the table returned to the client site. A message is also returned with the 1-dimensional; the message says "invalid table - invalid counts present" if the table is invalid and 'valid table' otherwise.

diff --git a/docs/reference/table2DDS.html b/docs/reference/table2DDS.html index 501a2273..0b5f74e1 100644 --- a/docs/reference/table2DDS.html +++ b/docs/reference/table2DDS.html @@ -69,7 +69,7 @@

Value

Details

It generates 2-dimensional contingency tables where valid (non-disclosive) tables are defined -as those where none of their cells have counts between 1 and the set threshold "nfilter.tab". When the ouput table +as those where none of their cells have counts between 1 and the set threshold "nfilter.tab". When the output table is invalid all cells except the total counts are replaced by missing values. Only the total counts are visible on the table returned to the client side. A message is also returned with the 2-dimensional table; the message says "invalid table - invalid counts present" if the table is invalid and 'valid table' otherwise.

diff --git a/docs/reference/testObjExistsDS.html b/docs/reference/testObjExistsDS.html index 09cb4b5f..a0246beb 100644 --- a/docs/reference/testObjExistsDS.html +++ b/docs/reference/testObjExistsDS.html @@ -1,5 +1,5 @@ -testObjExistsDS — testObjExistsDS • dsBasetestObjExistsDS — testObjExistsDS • dsBase @@ -40,7 +40,7 @@

testObjExistsDS

-

The serverside function called by ds.testObjExists

+

The server-side function called by ds.testObjExists

@@ -52,10 +52,14 @@

Arguments

test.obj.name
-

a clientside provided character string specifying the variable +

a client-side provided character string specifying the variable whose presence is to be tested in each data source

+
+

Value

+

List with `test.obj.exists` and `test.obj.class`

+

Details

Tests whether a given object exists in From fb2780ac3e1471c2b6de10329982104ae7e84b19 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:44:36 +0100 Subject: [PATCH 044/148] Remove superfluous text --- docs/authors.html | 4 ---- docs/pkgdown.yml | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/authors.html b/docs/authors.html index fe73b1d0..70570f2a 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -88,11 +88,7 @@

Citation

-<<<<<<< HEAD

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Wheater S (????). -======= -

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Wheater S (2025). ->>>>>>> refs/remotes/origin/v6.3.3-dev dsBase: 'DataSHIELD' Server Site Base Functions. R package version 6.3.3.

diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 7f059d1c..dbbcf4e6 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,8 +2,4 @@ pandoc: '3.4' pkgdown: 2.1.3 pkgdown_sha: ~ articles: {} -<<<<<<< HEAD -last_built: 2025-07-23T11:39Z -======= -last_built: 2025-07-16T10:31Z ->>>>>>> refs/remotes/origin/v6.3.3-dev +last_built: 2025-07-23T11:43Z From db494825a6cee80683dbcb7bbbe39f5dd1bf96d6 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:53:05 +0100 Subject: [PATCH 045/148] Fix path for reporter output --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 26264c83..f4d0487d 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -104,7 +104,7 @@ jobs: output_file <- file("test_console_output.txt"); sink(output_file); sink(output_file, type = "message"); - junit_rep <- testthat::JunitReporter$new(file = "test_results.xml"); + junit_rep <- testthat::JunitReporter$new(file = file.path(getwd(), "test_results.xml")); progress_rep <- testthat::ProgressReporter$new(max_failures = 999999); multi_rep <- testthat::MultiReporter$new(reporters = list(progress_rep, junit_rep)); testthat::test_package("${{ env.PROJECT_NAME }}", filter = "${{ env.TEST_FILTER }}", reporter = multi_rep, stop_on_failure = FALSE)'"'"' From 1a6a74183ee31a140852a348cdbc6bd161af34ec Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 23 Jul 2025 12:58:16 +0100 Subject: [PATCH 046/148] Update symbolic link --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index f4d0487d..1df06485 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -152,7 +152,7 @@ jobs: cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ # Create symbolic link - ln -sf logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/[latest] + ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From 771a91c38b3d34988c0b54a6868c268d8d93b770 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 08:48:31 +0100 Subject: [PATCH 047/148] Add additional dependencies to run the parser for test results --- .github/workflows/dsBase_test_suite.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 1df06485..ba3ddb35 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -68,6 +68,15 @@ jobs: extra-packages: | any::rcmdcheck cran::devtools + cran::git2r + cran::RCurl + cran::readr + cran::magrittr + cran::xml2 + cran::purrr + cran::dplyr + cran::stringr + cran::tidyr needs: check - name: Check man files up-to-date @@ -135,6 +144,10 @@ jobs: echo "os:$(lsb_release -ds)" >> ${{ env.DATETIME }}.txt echo "R:$(R --version | head -n1)" >> ${{ env.DATETIME }}.txt working-directory: dsBase/logs + + - name: Parse results from testthat and covr + run: | + Rscript --verbose --vanilla testStatus/source/parse_test_report.R dsBase/logs/ - name: Commit results to testStatus # if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' From e8fed4d1a5727e183982a8e8a375ab6f67977bc7 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 08:57:13 +0100 Subject: [PATCH 048/148] Change working directory to prevent error message when calling git2r::remote_url() --- .github/workflows/dsBase_test_suite.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index ba3ddb35..fe58c120 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -147,7 +147,8 @@ jobs: - name: Parse results from testthat and covr run: | - Rscript --verbose --vanilla testStatus/source/parse_test_report.R dsBase/logs/ + Rscript --verbose --vanilla ../testStatus/source/parse_test_report.R logs/ + working-directory: dsBase - name: Commit results to testStatus # if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' From c61416bd8a2c781e407ef9ec1dc8e4cef5adc87f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 11:39:09 +0100 Subject: [PATCH 049/148] Add additional packages to render test report in HTML format --- .github/workflows/dsBase_test_suite.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index fe58c120..de510a7a 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -77,6 +77,9 @@ jobs: cran::dplyr cran::stringr cran::tidyr + cran::quarto + cran::knitr + cran::kableExtra needs: check - name: Check man files up-to-date @@ -160,14 +163,17 @@ jobs: git pull mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ # Copy logs to new logs directory location cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ - # Create symbolic link + # Create symbolic links ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST - + ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest + + R -e "quarto::render('source/test_report.qmd', execute_params = list(input_dir = '"logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}"'), output_file = '"docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/"index.html')" # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From 1c46394802627c0ea332407cfc5f57f19a8aa16c Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 11:48:46 +0100 Subject: [PATCH 050/148] Correct function call render >> quarto_render --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index de510a7a..39c9f7c9 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -173,7 +173,7 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest - R -e "quarto::render('source/test_report.qmd', execute_params = list(input_dir = '"logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}"'), output_file = '"docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/"index.html')" + R -e "quarto::quarto_render('source/test_report.qmd', execute_params = list(input_dir = '"logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}"'), output_file = '"docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/"index.html')" # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From 36c31600d71bb160ca92b2243abd0e54fe01fd23 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 12:03:06 +0100 Subject: [PATCH 051/148] Remove additional quotation marks --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 39c9f7c9..fa0da83f 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -173,7 +173,7 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest - R -e "quarto::quarto_render('source/test_report.qmd', execute_params = list(input_dir = '"logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}"'), output_file = '"docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/"index.html')" + R -e "quarto::quarto_render('source/test_report.qmd', execute_params = list(input_dir = 'logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}'), output_file = 'docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html')" # Run status.py script here if applicable # e.g. source/status.py logs/... logs/... status.html ... From dbc689c9afca02de19cb7381363ece700c846fec Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 12:21:02 +0100 Subject: [PATCH 052/148] Update command to render quarto report --- .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 fa0da83f..d131dd18 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -173,9 +173,8 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest - R -e "quarto::quarto_render('source/test_report.qmd', execute_params = list(input_dir = 'logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}'), output_file = 'docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html')" - # Run status.py script here if applicable - # e.g. source/status.py logs/... logs/... status.html ... + R -e 'input_dir <- file.path("logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("env.DATETIME"), "html"))' + mv source/${{ env.DATETIME }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html git add . git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.DATETIME }}" From 23a22bf54165f1f92aba951f98b4383a93f65dda Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 12:42:35 +0100 Subject: [PATCH 053/148] Fix location of input for quarto_render command --- .github/workflows/dsBase_test_suite.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index d131dd18..c6329d99 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -126,7 +126,6 @@ jobs: "coveragelist.csv" )' - ls * mv coveragelist.csv logs/ mv test_* logs/ grep -q " FAIL 0 " logs/test_console_output.txt @@ -173,7 +172,7 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest - R -e 'input_dir <- file.path("logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("env.DATETIME"), "html"))' + R -e 'input_dir <- file.path("../logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("env.DATETIME"), ".html"))' mv source/${{ env.DATETIME }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html git add . From f9b4ca7c06593ea1bea5b0b95b2c40a9abd15976 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 12:53:36 +0100 Subject: [PATCH 054/148] Add line for debugging --- .github/workflows/dsBase_test_suite.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index c6329d99..92e287a8 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -172,6 +172,7 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest + R -e 'input_dir <- file.path("../logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME"));print(input_dir);list.files(input_dir);' R -e 'input_dir <- file.path("../logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("env.DATETIME"), ".html"))' mv source/${{ env.DATETIME }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html From b6f86dff8b7a2b96715a22517869476b7f2f2a62 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 13:05:36 +0100 Subject: [PATCH 055/148] Set up local environment variables --- .github/workflows/dsBase_test_suite.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 92e287a8..ea60f679 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -172,13 +172,18 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest - R -e 'input_dir <- file.path("../logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME"));print(input_dir);list.files(input_dir);' - R -e 'input_dir <- file.path("../logs", Sys.getenv("env.PROJECT_NAME"), Sys.getenv("env.BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("env.DATETIME"), ".html"))' + R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"));print(input_dir);list.files(input_dir);' + R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("DATETIME"), ".html"))' mv source/${{ env.DATETIME }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html git add . git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.DATETIME }}" git push + + env: + PROJECT_NAME: ${{ env.PROJECT_NAME }} + BRANCH_NAME: ${{ env.BRANCH_NAME }} + DATETIME: ${{ env.DATETIME }} - name: Dump environment info run: | From 510422a995a33f3e90b072045a29f49896e59331 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 13:18:04 +0100 Subject: [PATCH 056/148] Add missing portion of path --- .github/workflows/dsBase_test_suite.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index ea60f679..8d057ec1 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -172,8 +172,8 @@ jobs: ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest - R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"));print(input_dir);list.files(input_dir);' - R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("DATETIME"), ".html"))' + R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("DATETIME"));print(input_dir);list.files(input_dir);' + R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("DATETIME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("DATETIME"), ".html"))' mv source/${{ env.DATETIME }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html git add . From 2c26a0621c34123376f11741665aba53e0668404 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 13:29:14 +0100 Subject: [PATCH 057/148] Rename DATETIME to WORKFLOW_ID and update path to logs: ../logs >> logs --- .github/workflows/dsBase_test_suite.yaml | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 8d057ec1..325f5812 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -34,7 +34,7 @@ jobs: env: TEST_FILTER: '*' _r_check_system_clock_: 0 - DATETIME: ${{ github.run_id }}-${{ github.run_attempt }} + WORKFLOW_ID: ${{ github.run_id }}-${{ github.run_attempt }} PROJECT_NAME: dsBase BRANCH_NAME: ${{ github.ref_name }} REPO_OWNER: ${{ github.repository_owner }} @@ -142,9 +142,9 @@ jobs: - name: Write versions to file run: | - echo "branch:${{ env.BRANCH_NAME }}" > ${{ env.DATETIME }}.txt - echo "os:$(lsb_release -ds)" >> ${{ env.DATETIME }}.txt - echo "R:$(R --version | head -n1)" >> ${{ env.DATETIME }}.txt + 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 working-directory: dsBase/logs - name: Parse results from testthat and covr @@ -161,29 +161,29 @@ jobs: git checkout master git pull - mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ + mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ # Copy logs to new logs directory location - cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ - cp -rv ../dsBase/logs/${{ env.DATETIME }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ + cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../dsBase/logs/${{ env.WORKFLOW_ID }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ # Create symbolic links - ln -sf ${{ env.DATETIME }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST - ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/latest + ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST + ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest - R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("DATETIME"));print(input_dir);list.files(input_dir);' - R -e 'input_dir <- file.path("../logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("DATETIME")); quarto::quarto_render("source/test_report.qmd", execute_params = list(input_dir = input_dir), output_file = paste0(Sys.getenv("DATETIME"), ".html"))' - mv source/${{ env.DATETIME }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.DATETIME }}/index.html + R -e 'input_dir <- file.path("logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID"));print(input_dir);list.files(input_dir);' + R -e 'input_dir <- file.path("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), output_file = paste0(Sys.getenv("WORKFLOW_ID"), ".html"))' + mv source/${{ env.WORKFLOW_ID }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html git add . - git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.DATETIME }}" + git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" git push env: PROJECT_NAME: ${{ env.PROJECT_NAME }} BRANCH_NAME: ${{ env.BRANCH_NAME }} - DATETIME: ${{ env.DATETIME }} + WORKFLOW_ID: ${{ env.WORKFLOW_ID }} - name: Dump environment info run: | From fdfca18ccc4ca0fed65d9b051c4fe5496dace2e7 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 13:39:53 +0100 Subject: [PATCH 058/148] Revert path to match the working directory structure of the quarto_render command --- .github/workflows/dsBase_test_suite.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 325f5812..260a2463 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -172,8 +172,7 @@ jobs: ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest - R -e 'input_dir <- file.path("logs", Sys.getenv("PROJECT_NAME"), Sys.getenv("BRANCH_NAME"), Sys.getenv("WORKFLOW_ID"));print(input_dir);list.files(input_dir);' - R -e 'input_dir <- file.path("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), output_file = paste0(Sys.getenv("WORKFLOW_ID"), ".html"))' + R -e 'input_dir <- file.path("../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), output_file = paste0(Sys.getenv("WORKFLOW_ID"), ".html"))' mv source/${{ env.WORKFLOW_ID }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html git add . From 4078d70f0d91d08fe39a9ee6ebb5fd4ce2e9557c Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 14:03:01 +0100 Subject: [PATCH 059/148] Add missing dependencies and change output file for quarto_render --- .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 260a2463..81a68144 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -80,6 +80,8 @@ jobs: cran::quarto cran::knitr cran::kableExtra + cran::rmarkdown + cran::downlit needs: check - name: Check man files up-to-date @@ -172,8 +174,8 @@ jobs: ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest - R -e 'input_dir <- file.path("../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), output_file = paste0(Sys.getenv("WORKFLOW_ID"), ".html"))' - mv source/${{ env.WORKFLOW_ID }}.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html + R -e 'input_dir <- file.path("../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/index.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html git add . git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" From 5e779b8a31b72f0cee46cf3897e6a5e83be1d79d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 14:14:51 +0100 Subject: [PATCH 060/148] Correct name of output file from quarto_render: index.html >> test_report.html --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 81a68144..af86fa91 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -175,7 +175,7 @@ jobs: ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest R -e 'input_dir <- file.path("../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/index.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html + mv source/test_report.html docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html git add . git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" From b025cf1f6cee9d4f229d95946ac23dd75d0a0b28 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 15:02:09 +0100 Subject: [PATCH 061/148] Replace symbolic link with copy of the latest render of the test report (GHA failed to deploy when having a symbolic link) --- .github/workflows/dsBase_test_suite.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index af86fa91..70be3043 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -165,6 +165,9 @@ jobs: mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest}/ + # clear the latest directory + rm -rf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest}/* # Copy logs to new logs directory location cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ @@ -172,10 +175,11 @@ jobs: # Create symbolic links ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST - ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest + # ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest R -e 'input_dir <- file.path("../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 docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html + cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }} docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest git add . git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" From 260419fcbd0820a73df707177f0c7437ced8631c Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 22:44:04 +0100 Subject: [PATCH 062/148] Test removing unused token --- .github/workflows/dsBase_test_suite.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 70be3043..e8f1fae3 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -51,7 +51,6 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ secrets.DATASHIELD_DEV }} ref: master path: testStatus From f8a414133cf1452ff20a88f2389298f2ba1c5e27 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 24 Jul 2025 23:02:54 +0100 Subject: [PATCH 063/148] Update token name --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index e8f1fae3..83c6e9c5 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -38,7 +38,6 @@ jobs: PROJECT_NAME: dsBase BRANCH_NAME: ${{ github.ref_name }} REPO_OWNER: ${{ github.repository_owner }} - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes steps: @@ -51,6 +50,7 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus + token: ${{ secrets.GH_TOKEN }} ref: master path: testStatus From f6c657c7fbe9c9ccdff80470777e3e403afc56d3 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 25 Jul 2025 09:50:24 +0100 Subject: [PATCH 064/148] Fix path to latest documentation directory --- .github/workflows/dsBase_test_suite.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 83c6e9c5..7cc693a2 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -164,9 +164,9 @@ jobs: mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest}/ + mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/ # clear the latest directory - rm -rf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest}/* + rm -rf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/* # Copy logs to new logs directory location cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ @@ -178,7 +178,7 @@ jobs: R -e 'input_dir <- file.path("../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 docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html - cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }} docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest + cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest git add . git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" From 32b9639c7d5a040aae24dbaf6eed7047863d93b4 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 25 Jul 2025 10:31:28 +0100 Subject: [PATCH 065/148] Update name of workflow --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 7cc693a2..e951ca3a 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -9,7 +9,7 @@ # # As of Jul 2025 this takes ~ 9 mins to run. ################################################################################ -name: DataSHIELD GHA test suite for dsBase +name: dsBase tests' suite on: push: From b45cd42326c6f00a05cb39a463b918e348a5e30d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 25 Jul 2025 15:05:48 +0100 Subject: [PATCH 066/148] Update branches and simplify schedules --- .github/workflows/dsBase_test_suite.yaml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index e951ca3a..04319b4f 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -13,13 +13,10 @@ name: dsBase tests' suite on: push: - branches: - - master - - v6.3.3-dev - + branches: [master, v6.3.4-dev] schedule: - - cron: '0 0 * * 0' # Weekly on master - - cron: '0 1 * * *' # Nightly on v6.3.3-dev + - cron: '0 0 * * 0' # Weekly + - cron: '0 1 * * *' # Nightly jobs: dsBase_test_suite: From a9cfef563bd33aa2a06d79039f83240ded68569f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 25 Jul 2025 15:32:40 +0100 Subject: [PATCH 067/148] Test changing token location --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 04319b4f..3932367d 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -47,7 +47,7 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ secrets.GH_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} ref: master path: testStatus From 891d9ddea921d02ad89b12c9854d66bcb44e4e17 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 25 Jul 2025 15:45:17 +0100 Subject: [PATCH 068/148] Add contents writing permission --- .github/workflows/dsBase_test_suite.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 3932367d..9b21e9b4 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -22,6 +22,8 @@ jobs: dsBase_test_suite: runs-on: ubuntu-latest timeout-minutes: 120 + permissions: + contents: write # These should all be constant, except TEST_FILTER. This can be used to test # subsets of test files in the testthat directory. Options are like: From 55e7a37af5cc85fcc6a0ef58faea5841ee766c5e Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 28 Jul 2025 10:35:57 +0100 Subject: [PATCH 069/148] Add test-coverage GHA workflow --- .github/workflows/test-coverage.yaml | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/test-coverage.yaml diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 00000000..0ab748d6 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,62 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + +name: test-coverage.yaml + +permissions: read-all + +jobs: + test-coverage: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::covr, any::xml2 + needs: coverage + + - name: Test coverage + run: | + cov <- covr::package_coverage( + quiet = FALSE, + clean = FALSE, + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") + ) + print(cov) + covr::to_cobertura(cov) + shell: Rscript {0} + + - uses: codecov/codecov-action@v5 + with: + # Fail if error if not on PR, or if on PR and token is given + fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }} + files: ./cobertura.xml + plugins: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Show testthat output + if: always() + run: | + ## -------------------------------------------------------------------- + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v4 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package From 260f178c2660924599d1d5babb6828a4925df0df Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 28 Jul 2025 10:36:11 +0100 Subject: [PATCH 070/148] Add badge for test coverage --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index de46eade..cc983936 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![](https://www.r-pkg.org/badges/version/dsBase?color=black)](https://cran.r-project.org/package=dsBase) [![R build status](https://github.com/datashield/dsBase/workflows/R-CMD-check/badge.svg)](https://github.com/datashield/dsBase/actions) +[![Codecov test coverage](https://codecov.io/gh/datashield/dsBase/graph/badge.svg)](https://app.codecov.io/gh/datashield/dsBase) ## Installation From 5238e32fb6a5e3d52f68e884c85fc1a0c9def238 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Mon, 28 Jul 2025 10:40:29 +0100 Subject: [PATCH 071/148] Role back to custom token for deploying changes to testStatus --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 9b21e9b4..00b230a4 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -49,7 +49,7 @@ jobs: uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.GH_TOKEN }} ref: master path: testStatus From acdd3fbda00de584ba017e09b4739659ab47a73f Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Fri, 1 Aug 2025 15:35:54 +0100 Subject: [PATCH 072/148] Added 'carrot' privacy level --- R/BooleDS.R | 2 +- R/cbindDS.R | 4 ++-- R/dataFrameDS.R | 2 +- R/dataFrameSortDS.R | 2 +- R/dataFrameSubsetDS1.R | 2 +- R/dataFrameSubsetDS2.R | 2 +- R/levelsDS.R | 2 +- R/reShapeDS.R | 2 +- R/recodeLevelsDS.R | 2 +- R/recodeValuesDS.R | 2 +- R/subsetByClassDS.R | 2 +- R/subsetDS.R | 2 +- R/vectorDS.R | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/R/BooleDS.R b/R/BooleDS.R index 1ad5e14f..0f54dfca 100644 --- a/R/BooleDS.R +++ b/R/BooleDS.R @@ -28,7 +28,7 @@ BooleDS <- function(V1.name=NULL, V2.name=NULL, Boolean.operator.n=NULL, na.assign.text, numeric.output=TRUE){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ######################################################################### # DataSHIELD MODULE: CAPTURE THE nfilter SETTINGS # diff --git a/R/cbindDS.R b/R/cbindDS.R index 5d5464e7..fcde369b 100644 --- a/R/cbindDS.R +++ b/R/cbindDS.R @@ -1,5 +1,5 @@ #' @title cbindDS called by ds.cbind -#' @description serverside assign function that takes a +x#' @description serverside assign function that takes a #' sequence of vector, matrix or data-frame arguments #' and combines them by column to produce a data-frame. #' @details A sequence of vector, matrix or data-frame arguments @@ -24,7 +24,7 @@ cbindDS <- function(x.names.transmit=NULL, colnames.transmit=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) x.names.input <- x.names.transmit x.names.act1 <- unlist(strsplit(x.names.input, split=",")) diff --git a/R/dataFrameDS.R b/R/dataFrameDS.R index a3e06f4c..7a2b36be 100644 --- a/R/dataFrameDS.R +++ b/R/dataFrameDS.R @@ -40,7 +40,7 @@ dataFrameDS <- function(vectors=NULL, r.names=NULL, ch.rows=FALSE, ch.names=TRUE, clnames=NULL, strAsFactors=TRUE, completeCases=FALSE){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ######################################################################### # DataSHIELD MODULE: CAPTURE THE nfilter SETTINGS diff --git a/R/dataFrameSortDS.R b/R/dataFrameSortDS.R index 0ea3b3c1..a398a70b 100644 --- a/R/dataFrameSortDS.R +++ b/R/dataFrameSortDS.R @@ -36,7 +36,7 @@ dataFrameSortDS <- function(df.name=NULL,sort.key.name=NULL,sort.descending,sort.method){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ######################################################################### # DataSHIELD MODULE: CAPTURE THE nfilter SETTINGS diff --git a/R/dataFrameSubsetDS1.R b/R/dataFrameSubsetDS1.R index 232e405c..4b3c9476 100644 --- a/R/dataFrameSubsetDS1.R +++ b/R/dataFrameSubsetDS1.R @@ -50,7 +50,7 @@ dataFrameSubsetDS1 <- function(df.name=NULL,V1.name=NULL,V2.name=NULL,Boolean.operator.n=NULL,keep.cols=NULL,rm.cols=NULL,keep.NAs=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ######################################################################### # DataSHIELD MODULE: CAPTURE THE nfilter SETTINGS diff --git a/R/dataFrameSubsetDS2.R b/R/dataFrameSubsetDS2.R index 3a59602f..05938a60 100644 --- a/R/dataFrameSubsetDS2.R +++ b/R/dataFrameSubsetDS2.R @@ -59,7 +59,7 @@ dataFrameSubsetDS2<-function(df.name=NULL,V1.name=NULL, V2.name=NULL, Boolean.operator.n=NULL,keep.cols=NULL, rm.cols=NULL, keep.NAs=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ######################################################################### # DataSHIELD MODULE: CAPTURE THE nfilter SETTINGS # diff --git a/R/levelsDS.R b/R/levelsDS.R index 9bb54401..bdb374d5 100644 --- a/R/levelsDS.R +++ b/R/levelsDS.R @@ -10,7 +10,7 @@ levelsDS <- function(x){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ################################################################## #MODULE 1: CAPTURE THE nfilter SETTINGS # diff --git a/R/reShapeDS.R b/R/reShapeDS.R index 6dbf0654..2ec368a5 100644 --- a/R/reShapeDS.R +++ b/R/reShapeDS.R @@ -43,7 +43,7 @@ reShapeDS <- function(data.name, varying.transmit, v.names.transmit, timevar.name, idvar.name, drop.transmit, direction, sep){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) datatext <- paste0("data.frame(",data.name,")") data <- eval(parse(text=datatext), envir = parent.frame()) diff --git a/R/recodeLevelsDS.R b/R/recodeLevelsDS.R index c773e774..6878faa6 100644 --- a/R/recodeLevelsDS.R +++ b/R/recodeLevelsDS.R @@ -11,7 +11,7 @@ recodeLevelsDS <- function (x=NULL, classes=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) # check if the input vector is valid (i.e. meets DataSHIELD criteria) check <- isValidDS(x) diff --git a/R/recodeValuesDS.R b/R/recodeValuesDS.R index f29dc0fa..d22a7862 100644 --- a/R/recodeValuesDS.R +++ b/R/recodeValuesDS.R @@ -31,7 +31,7 @@ recodeValuesDS <- function(var.name.text=NULL, values2replace.text=NULL, new.values.text=NULL, missing=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) ############################################################# #MODULE 1: CAPTURE THE used nfilter SETTINGS diff --git a/R/subsetByClassDS.R b/R/subsetByClassDS.R index f213bb4d..e4063482 100644 --- a/R/subsetByClassDS.R +++ b/R/subsetByClassDS.R @@ -18,7 +18,7 @@ subsetByClassDS <- function(data=NULL, variables=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) # this filter sets the minimum number of observations that are allowed diff --git a/R/subsetDS.R b/R/subsetDS.R index 7ba57ac2..2ab0a14c 100644 --- a/R/subsetDS.R +++ b/R/subsetDS.R @@ -30,7 +30,7 @@ subsetDS <- function(dt=NULL, complt=NULL, rs=NULL, cs=NULL, lg=NULL, th=NULL, varname=NULL){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) # this filter sets the minimum number of observations that are allowed diff --git a/R/vectorDS.R b/R/vectorDS.R index 8efacf97..e1bff36b 100644 --- a/R/vectorDS.R +++ b/R/vectorDS.R @@ -10,7 +10,7 @@ #' vectorDS <- function(...){ # Check Permissive Privacy Control Level. - dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana')) + dsBase::checkPermissivePrivacyControlLevel(c('permissive', 'banana', 'carrot')) # compute the vector's value out <- c(...) From 4bc866b916016a6150a728a9eea4ebbda4c2d24b Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 6 Aug 2025 13:12:31 +0100 Subject: [PATCH 073/148] Fix typo in cbindDS.R Fixed typo --- R/cbindDS.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/cbindDS.R b/R/cbindDS.R index fcde369b..b7864864 100644 --- a/R/cbindDS.R +++ b/R/cbindDS.R @@ -1,5 +1,5 @@ #' @title cbindDS called by ds.cbind -x#' @description serverside assign function that takes a +#' @description serverside assign function that takes a #' sequence of vector, matrix or data-frame arguments #' and combines them by column to produce a data-frame. #' @details A sequence of vector, matrix or data-frame arguments From 4706682489ba07ac12773370238880195230f230 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 6 Aug 2025 13:13:43 +0100 Subject: [PATCH 074/148] Update DATASHIELD --- inst/DATASHIELD | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inst/DATASHIELD b/inst/DATASHIELD index cacfc42b..ab654bea 100644 --- a/inst/DATASHIELD +++ b/inst/DATASHIELD @@ -160,4 +160,6 @@ AssignMethods: acos=base::acos, atan=base::atan, sum=base::sum, - unlist=base::unlist \ No newline at end of file + unlist=base::unlist +Options: + testoption=100 From 82b254b252ffd87c78aeb14134e028dc22e6962e Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 6 Aug 2025 15:44:03 +0100 Subject: [PATCH 075/148] Rework Options --- R/zzz.R | 20 -------------------- inst/DATASHIELD | 14 +++++++++++++- 2 files changed, 13 insertions(+), 21 deletions(-) delete mode 100644 R/zzz.R diff --git a/R/zzz.R b/R/zzz.R deleted file mode 100644 index 6586ae7c..00000000 --- a/R/zzz.R +++ /dev/null @@ -1,20 +0,0 @@ -ENV <- new.env() - -.onLoad = function(libname, pkgname) { - - #### !!! If making changes, update: .onLoad(), set_opts(), show_opts(), .check_options() - - options( - datashield.privacyLevel = 5, - default.datashield.privacyControlLevel = "banana", - default.nfilter.glm = 0.33, - default.nfilter.kNN = 3, - default.nfilter.string = 80, - default.nfilter.subset = 3, - default.nfilter.stringShort = 20, - default.nfilter.tab = 3, - default.nfilter.noise = 0.25, - default.nfilter.levels.density = 0.33, - default.nfilter.levels.max = 40 - ) -} \ No newline at end of file diff --git a/inst/DATASHIELD b/inst/DATASHIELD index cacfc42b..c9dd9390 100644 --- a/inst/DATASHIELD +++ b/inst/DATASHIELD @@ -160,4 +160,16 @@ AssignMethods: acos=base::acos, atan=base::atan, sum=base::sum, - unlist=base::unlist \ No newline at end of file + unlist=base::unlist +Options: + datashield.privacyLevel=5, + default.datashield.privacyControlLevel="banana", + default.nfilter.glm=0.33, + default.nfilter.kNN=3, + default.nfilter.string=80, + default.nfilter.subset=3, + default.nfilter.stringShort=20, + default.nfilter.tab=3, + default.nfilter.noise=0.25, + default.nfilter.levels.density=0.33, + default.nfilter.levels.max=40 From 846c9a00bb2937abf2a2205f02abd60d9f71690b Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 6 Aug 2025 16:05:50 +0100 Subject: [PATCH 076/148] Switched to 'permissive' --- inst/DATASHIELD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/DATASHIELD b/inst/DATASHIELD index c9dd9390..80012369 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 464c150f5d9d8b413740792d821ea02b7fad2cb3 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Fri, 8 Aug 2025 15:56:15 +0100 Subject: [PATCH 077/148] Added '.Random.seed' to 'utils::globalVariables' --- R/global.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/global.R b/R/global.R index 89970bc0..302a35b1 100644 --- a/R/global.R +++ b/R/global.R @@ -2,5 +2,5 @@ utils::globalVariables(c('offset.to.use', 'weights.to.use', 'out.table.real', 'out.table.dim', 'out.table.dimnames', 'list.obj', 'mg', 'blackbox.output.df', 'blackbox.ranks.df', 'global.bounds.df', 'global.ranks.quantiles.df', 'sR4.df', - 'min.max.df','sR5.df','input.mean.sd.df','input.ranks.sd.df','RS','CG','mixed', 'x','y')) + 'min.max.df','sR5.df','input.mean.sd.df','input.ranks.sd.df','RS','CG','mixed','x','y','.Random.seed')) From ee47a80b5fec8a47b558a17e08a08bfdbe04f5a7 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Tue, 12 Aug 2025 16:35:24 +0100 Subject: [PATCH 078/148] Rework restoring '.Random.seed' --- R/blackBoxDS.R | 7 +++++-- R/blackBoxRanksDS.R | 7 +++++-- R/heatmapPlotDS.R | 7 +++++-- R/histogramDS1.R | 7 +++++-- R/histogramDS2.R | 7 +++++-- R/minMaxRandDS.R | 7 +++++-- R/rangeDS.R | 7 +++++-- R/scatterPlotDS.R | 7 +++++-- 8 files changed, 40 insertions(+), 16 deletions(-) diff --git a/R/blackBoxDS.R b/R/blackBoxDS.R index 8e7e33f1..a2ac1efc 100644 --- a/R/blackBoxDS.R +++ b/R/blackBoxDS.R @@ -67,8 +67,11 @@ blackBoxDS <- function(input.var.name=NULL, ######################################################## # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) input.var <- eval(parse(text=input.var.name), envir = parent.frame()) diff --git a/R/blackBoxRanksDS.R b/R/blackBoxRanksDS.R index cb2fc21f..27a85778 100644 --- a/R/blackBoxRanksDS.R +++ b/R/blackBoxRanksDS.R @@ -62,8 +62,11 @@ blackBoxRanksDS <- function(input.var.name=NULL, shared.seedval){ #START FUNC ######################################################## # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) input.var <- eval(parse(text=input.var.name), envir = parent.frame()) input.global.ranks<-input.var diff --git a/R/heatmapPlotDS.R b/R/heatmapPlotDS.R index 6dccbd5b..68302392 100644 --- a/R/heatmapPlotDS.R +++ b/R/heatmapPlotDS.R @@ -39,8 +39,11 @@ heatmapPlotDS <- function(x, y, k, noise, method.indicator){ ################################################################### # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) # Cbind the columns of the two variables and remove any rows that include NAs data.table <- cbind.data.frame(x, y) diff --git a/R/histogramDS1.R b/R/histogramDS1.R index a79d2f52..c5f68d41 100644 --- a/R/histogramDS1.R +++ b/R/histogramDS1.R @@ -37,8 +37,11 @@ histogramDS1 <- function(xvect, method.indicator, k, noise){ ################################################################## # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) # print an error message if the input vector is not a numeric if(!(is.numeric(xvect))){ diff --git a/R/histogramDS2.R b/R/histogramDS2.R index 1f7a8acc..cffed190 100644 --- a/R/histogramDS2.R +++ b/R/histogramDS2.R @@ -39,8 +39,11 @@ histogramDS2 <- function (xvect, num.breaks, min, max, method.indicator, k, nois ################################################################## # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) if (method.indicator==1){ diff --git a/R/minMaxRandDS.R b/R/minMaxRandDS.R index 0346eb75..e6ccfc82 100644 --- a/R/minMaxRandDS.R +++ b/R/minMaxRandDS.R @@ -21,8 +21,11 @@ minMaxRandDS <- function(input.var.name){ #START FUNC # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) input.var <- eval(parse(text=input.var.name), envir = parent.frame()) diff --git a/R/rangeDS.R b/R/rangeDS.R index 6cf7689c..9c391b69 100644 --- a/R/rangeDS.R +++ b/R/rangeDS.R @@ -9,8 +9,11 @@ #' rangeDS <- function(xvect) { # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) # print an error message if the input vector is not a numeric if (!(is.numeric(xvect))) { diff --git a/R/scatterPlotDS.R b/R/scatterPlotDS.R index bf229041..62fbc6a6 100644 --- a/R/scatterPlotDS.R +++ b/R/scatterPlotDS.R @@ -44,8 +44,11 @@ scatterPlotDS <- function(x, y, method.indicator, k, noise){ ################################################################### # back-up current .Random.seed and revert on.exit - old_seed <- .Random.seed - on.exit(.Random.seed <- old_seed, add = TRUE) + if (exists(x = ".Random.seed", envir = globalenv())) { + assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + } else + on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) # Cbind the columns of the two variables and remove any rows that include NAs data.table <- cbind.data.frame(x, y) From 85a55295729a9d460b6d252e8d65566ab5d7f4cf Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 13 Aug 2025 09:41:40 +0100 Subject: [PATCH 079/148] Switch back to 'banana' --- inst/DATASHIELD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inst/DATASHIELD b/inst/DATASHIELD index bd17fe82..c9dd9390 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, @@ -172,4 +172,4 @@ Options: default.nfilter.tab=3, default.nfilter.noise=0.25, default.nfilter.levels.density=0.33, - default.nfilter.levels.max=40 \ No newline at end of file + default.nfilter.levels.max=40 From bd483bdad2ead018bd9c6030659ab11e80ef1e55 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 13 Aug 2025 21:08:31 +0100 Subject: [PATCH 080/148] Rework access to 'old_seed' --- R/rangeDS.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/rangeDS.R b/R/rangeDS.R index 9c391b69..a32d7a90 100644 --- a/R/rangeDS.R +++ b/R/rangeDS.R @@ -11,7 +11,7 @@ rangeDS <- function(xvect) { # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + on.exit({ assign(x = ".Random.seed", value = parent.frame()$old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) From 90dcb61539d3689742911d9474b58ed7c8ec86f0 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 13 Aug 2025 22:23:07 +0100 Subject: [PATCH 081/148] Update global.R --- R/global.R | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/R/global.R b/R/global.R index 302a35b1..0d6a702f 100644 --- a/R/global.R +++ b/R/global.R @@ -2,5 +2,4 @@ utils::globalVariables(c('offset.to.use', 'weights.to.use', 'out.table.real', 'out.table.dim', 'out.table.dimnames', 'list.obj', 'mg', 'blackbox.output.df', 'blackbox.ranks.df', 'global.bounds.df', 'global.ranks.quantiles.df', 'sR4.df', - 'min.max.df','sR5.df','input.mean.sd.df','input.ranks.sd.df','RS','CG','mixed','x','y','.Random.seed')) - + 'min.max.df','sR5.df','input.mean.sd.df','input.ranks.sd.df','RS','CG','mixed','x','y','old_seed','.Random.seed')) From c81e5ed10c0cd40779597b0949cf4795726361db Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 13 Aug 2025 23:34:34 +0100 Subject: [PATCH 082/148] Switch 'old_seed' to '.old_seed' --- R/blackBoxDS.R | 4 ++-- R/blackBoxRanksDS.R | 4 ++-- R/global.R | 2 +- R/heatmapPlotDS.R | 4 ++-- R/histogramDS1.R | 4 ++-- R/histogramDS2.R | 4 ++-- R/minMaxRandDS.R | 4 ++-- R/rangeDS.R | 4 ++-- R/scatterPlotDS.R | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/R/blackBoxDS.R b/R/blackBoxDS.R index a2ac1efc..63cf0160 100644 --- a/R/blackBoxDS.R +++ b/R/blackBoxDS.R @@ -68,8 +68,8 @@ blackBoxDS <- function(input.var.name=NULL, # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/blackBoxRanksDS.R b/R/blackBoxRanksDS.R index 27a85778..522307a8 100644 --- a/R/blackBoxRanksDS.R +++ b/R/blackBoxRanksDS.R @@ -63,8 +63,8 @@ blackBoxRanksDS <- function(input.var.name=NULL, shared.seedval){ #START FUNC # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/global.R b/R/global.R index 0d6a702f..a3c9454e 100644 --- a/R/global.R +++ b/R/global.R @@ -2,4 +2,4 @@ utils::globalVariables(c('offset.to.use', 'weights.to.use', 'out.table.real', 'out.table.dim', 'out.table.dimnames', 'list.obj', 'mg', 'blackbox.output.df', 'blackbox.ranks.df', 'global.bounds.df', 'global.ranks.quantiles.df', 'sR4.df', - 'min.max.df','sR5.df','input.mean.sd.df','input.ranks.sd.df','RS','CG','mixed','x','y','old_seed','.Random.seed')) + 'min.max.df','sR5.df','input.mean.sd.df','input.ranks.sd.df','RS','CG','mixed','x','y','.old_seed','.Random.seed')) diff --git a/R/heatmapPlotDS.R b/R/heatmapPlotDS.R index 68302392..349f57b9 100644 --- a/R/heatmapPlotDS.R +++ b/R/heatmapPlotDS.R @@ -40,8 +40,8 @@ heatmapPlotDS <- function(x, y, k, noise, method.indicator){ # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/histogramDS1.R b/R/histogramDS1.R index c5f68d41..71ffc439 100644 --- a/R/histogramDS1.R +++ b/R/histogramDS1.R @@ -38,8 +38,8 @@ histogramDS1 <- function(xvect, method.indicator, k, noise){ # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/histogramDS2.R b/R/histogramDS2.R index cffed190..001ab0dd 100644 --- a/R/histogramDS2.R +++ b/R/histogramDS2.R @@ -40,8 +40,8 @@ histogramDS2 <- function (xvect, num.breaks, min, max, method.indicator, k, nois # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/minMaxRandDS.R b/R/minMaxRandDS.R index e6ccfc82..64caf7ae 100644 --- a/R/minMaxRandDS.R +++ b/R/minMaxRandDS.R @@ -22,8 +22,8 @@ minMaxRandDS <- function(input.var.name){ #START FUNC # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/rangeDS.R b/R/rangeDS.R index a32d7a90..ec9183ea 100644 --- a/R/rangeDS.R +++ b/R/rangeDS.R @@ -10,8 +10,8 @@ rangeDS <- function(xvect) { # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = parent.frame()$old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) diff --git a/R/scatterPlotDS.R b/R/scatterPlotDS.R index 62fbc6a6..ab48be10 100644 --- a/R/scatterPlotDS.R +++ b/R/scatterPlotDS.R @@ -45,8 +45,8 @@ scatterPlotDS <- function(x, y, method.indicator, k, noise){ # back-up current .Random.seed and revert on.exit if (exists(x = ".Random.seed", envir = globalenv())) { - assign(x = "old_seed", value = .Random.seed, envir = parent.frame()); - on.exit({ assign(x = ".Random.seed", value = old_seed, envir = globalenv()); remove("old_seed", envir = parent.frame()) }, add = TRUE) + assign(x = ".old_seed", value = .Random.seed, envir = parent.frame()); + on.exit({ assign(x = ".Random.seed", value = parent.frame()$.old_seed, envir = globalenv()); remove(".old_seed", envir = parent.frame()) }, add = TRUE) } else on.exit(if (exists(x = ".Random.seed", envir = globalenv())) remove(".Random.seed", envir = globalenv()), add = TRUE) From 1694677ff7be8bdaf82f1a17f8cea4467c152b3f Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Mon, 18 Aug 2025 14:38:47 +0100 Subject: [PATCH 083/148] Update version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 8c7be464..2732c4db 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.4-9000 +Version: 6.3.4 Authors@R: c(person(given = "Paul", family = "Burton", role = c("aut"), From 2c209f0eb0f2a64a56bd7124ad4946296a0dffd3 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Mon, 18 Aug 2025 14:39:29 +0100 Subject: [PATCH 084/148] Update docs --- docs/404.html | 4 +-- docs/LICENSE.html | 4 +-- docs/authors.html | 36 ++++++++++++------- docs/index.html | 29 ++++++++------- docs/pkgdown.yml | 4 +-- docs/reference/BooleDS.html | 4 +-- docs/reference/absDS.html | 4 +-- docs/reference/asCharacterDS.html | 4 +-- docs/reference/asDataMatrixDS.html | 4 +-- docs/reference/asFactorDS1.html | 4 +-- docs/reference/asFactorDS2.html | 4 +-- docs/reference/asFactorSimpleDS.html | 4 +-- docs/reference/asIntegerDS.html | 4 +-- docs/reference/asListDS.html | 4 +-- docs/reference/asLogicalDS.html | 4 +-- docs/reference/asMatrixDS.html | 4 +-- docs/reference/asNumericDS.html | 4 +-- docs/reference/aucDS.html | 4 +-- docs/reference/blackBoxDS.html | 4 +-- docs/reference/blackBoxRanksDS.html | 4 +-- docs/reference/boxPlotGGDS.html | 4 +-- .../reference/boxPlotGG_data_TreatmentDS.html | 4 +-- .../boxPlotGG_data_Treatment_numericDS.html | 4 +-- docs/reference/bp_standardsDS.html | 4 +-- docs/reference/cDS.html | 4 +-- docs/reference/cbindDS.html | 4 +-- docs/reference/changeRefGroupDS.html | 4 +-- docs/reference/checkNegValueDS.html | 4 +-- .../checkPermissivePrivacyControlLevel.html | 4 +-- docs/reference/classDS.html | 4 +-- docs/reference/colnamesDS.html | 4 +-- docs/reference/completeCasesDS.html | 4 +-- docs/reference/corDS.html | 4 +-- docs/reference/corTestDS.html | 4 +-- docs/reference/covDS.html | 4 +-- docs/reference/dataFrameDS.html | 4 +-- docs/reference/dataFrameFillDS.html | 4 +-- docs/reference/dataFrameSortDS.html | 4 +-- docs/reference/dataFrameSubsetDS1.html | 4 +-- docs/reference/dataFrameSubsetDS2.html | 4 +-- docs/reference/densityGridDS.html | 4 +-- docs/reference/dimDS.html | 4 +-- docs/reference/dmtC2SDS.html | 4 +-- docs/reference/elsplineDS.html | 4 +-- docs/reference/extractQuantilesDS1.html | 4 +-- docs/reference/extractQuantilesDS2.html | 4 +-- docs/reference/gamlssDS.html | 4 +-- docs/reference/getWGSRDS.html | 4 +-- docs/reference/glmDS1.html | 4 +-- docs/reference/glmDS2.html | 4 +-- docs/reference/glmPredictDS.ag.html | 4 +-- docs/reference/glmPredictDS.as.html | 4 +-- docs/reference/glmSLMADS.assign.html | 4 +-- docs/reference/glmSLMADS1.html | 4 +-- docs/reference/glmSLMADS2.html | 4 +-- docs/reference/glmSummaryDS.ag.html | 4 +-- docs/reference/glmSummaryDS.as.html | 4 +-- docs/reference/glmerSLMADS.assign.html | 4 +-- docs/reference/glmerSLMADS2.html | 4 +-- docs/reference/heatmapPlotDS.html | 4 +-- docs/reference/hetcorDS.html | 4 +-- docs/reference/histogramDS1.html | 4 +-- docs/reference/histogramDS2.html | 4 +-- docs/reference/igb_standardsDS.html | 4 +-- docs/reference/index.html | 4 +-- docs/reference/isNaDS.html | 4 +-- docs/reference/isValidDS.html | 4 +-- docs/reference/kurtosisDS1.html | 4 +-- docs/reference/kurtosisDS2.html | 4 +-- docs/reference/lengthDS.html | 4 +-- docs/reference/levelsDS.html | 4 +-- docs/reference/lexisDS1.html | 4 +-- docs/reference/lexisDS2.html | 4 +-- docs/reference/lexisDS3.html | 4 +-- docs/reference/listDS.html | 4 +-- docs/reference/listDisclosureSettingsDS.html | 4 +-- docs/reference/lmerSLMADS.assign.html | 4 +-- docs/reference/lmerSLMADS2.html | 4 +-- docs/reference/lsDS.html | 4 +-- docs/reference/lsplineDS.html | 4 +-- docs/reference/matrixDS.html | 4 +-- docs/reference/matrixDetDS1.html | 4 +-- docs/reference/matrixDetDS2.html | 4 +-- docs/reference/matrixDiagDS.html | 4 +-- docs/reference/matrixDimnamesDS.html | 4 +-- docs/reference/matrixInvertDS.html | 4 +-- docs/reference/matrixMultDS.html | 4 +-- docs/reference/matrixTransposeDS.html | 4 +-- docs/reference/meanDS.html | 4 +-- docs/reference/meanSdGpDS.html | 4 +-- docs/reference/mergeDS.html | 4 +-- docs/reference/messageDS.html | 4 +-- docs/reference/metadataDS.html | 4 +-- docs/reference/miceDS.html | 4 +-- docs/reference/minMaxRandDS.html | 4 +-- docs/reference/namesDS.html | 4 +-- docs/reference/nsDS.html | 4 +-- docs/reference/numNaDS.html | 4 +-- docs/reference/qlsplineDS.html | 4 +-- docs/reference/quantileMeanDS.html | 4 +-- docs/reference/rBinomDS.html | 4 +-- docs/reference/rNormDS.html | 4 +-- docs/reference/rPoisDS.html | 4 +-- docs/reference/rUnifDS.html | 4 +-- docs/reference/rangeDS.html | 4 +-- docs/reference/ranksSecureDS1.html | 4 +-- docs/reference/ranksSecureDS2.html | 4 +-- docs/reference/ranksSecureDS3.html | 4 +-- docs/reference/ranksSecureDS4.html | 4 +-- docs/reference/ranksSecureDS5.html | 4 +-- docs/reference/rbindDS.html | 4 +-- docs/reference/reShapeDS.html | 4 +-- docs/reference/recodeLevelsDS.html | 4 +-- docs/reference/recodeValuesDS.html | 4 +-- docs/reference/repDS.html | 4 +-- docs/reference/replaceNaDS.html | 4 +-- docs/reference/rmDS.html | 4 +-- docs/reference/rowColCalcDS.html | 4 +-- docs/reference/sampleDS.html | 4 +-- docs/reference/scatterPlotDS.html | 4 +-- docs/reference/seqDS.html | 4 +-- docs/reference/setSeedDS.html | 4 +-- docs/reference/skewnessDS1.html | 4 +-- docs/reference/skewnessDS2.html | 4 +-- docs/reference/sqrtDS.html | 4 +-- docs/reference/subsetByClassDS.html | 4 +-- docs/reference/subsetDS.html | 4 +-- docs/reference/table1DDS.html | 4 +-- docs/reference/table2DDS.html | 4 +-- docs/reference/tableDS.assign.html | 4 +-- docs/reference/tableDS.html | 4 +-- docs/reference/tableDS2.html | 4 +-- docs/reference/tapplyDS.assign.html | 4 +-- docs/reference/tapplyDS.html | 4 +-- docs/reference/testObjExistsDS.html | 4 +-- docs/reference/unListDS.html | 4 +-- docs/reference/uniqueDS.html | 4 +-- docs/reference/varDS.html | 4 +-- docs/reference/vectorDS.html | 4 +-- 139 files changed, 314 insertions(+), 299 deletions(-) diff --git a/docs/404.html b/docs/404.html index c2a9f93c..8ba2804e 100644 --- a/docs/404.html +++ b/docs/404.html @@ -32,7 +32,7 @@ dsBase - 6.3.3 + 6.3.4
@@ -73,7 +73,7 @@

Page not found (404)

diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 158c5efe..39bf3d39 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -17,7 +17,7 @@ dsBase - 6.3.3 + 6.3.4
@@ -256,7 +256,7 @@

NA

diff --git a/docs/authors.html b/docs/authors.html index 70570f2a..7008d201 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -17,7 +17,7 @@ dsBase - 6.3.3 + 6.3.4
@@ -40,19 +40,19 @@

Authors and Citation

  • -

    Paul Burton. Author. +

    Paul Burton. Author.

  • -

    Rebecca Wilson. Author. +

    Rebecca Wilson. Author.

  • -

    Olly Butters. Author. +

    Olly Butters. Author.

  • -

    Patricia Ryser-Welch. Author. +

    Patricia Ryser-Welch. Author.

  • @@ -75,6 +75,18 @@

    Authors and Citation

    Yannick Marcon. Author.

  • +
  • +

    Tom Bishop. Author. +

    +
  • +
  • +

    Amadou Gaye. Author. +

    +
  • +
  • +

    Xavier Escribà-Montagut. Author. +

    +
  • Stuart Wheater. Author, maintainer.

    @@ -88,14 +100,14 @@

    Citation

-

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Wheater S (????). -dsBase: 'DataSHIELD' Server Site Base Functions. -R package version 6.3.3. +

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.

@Manual{,
-  title = {dsBase: 'DataSHIELD' Server Site 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 Stuart Wheater},
-  note = {R package version 6.3.3},
+  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},
 }

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, Oliver 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.” @@ -152,7 +164,7 @@

Citation

diff --git a/docs/index.html b/docs/index.html index ca9ac5a7..1af30cbf 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,13 +5,13 @@ -DataSHIELD Server Site Base Functions • dsBase +DataSHIELD Server Side Base Functions • dsBase - + Generates a density grid with or without a priori defined limits — densityGridDS • dsBaseGenerates a density grid with or without a priori defined limits — densityGridDS • dsBase @@ -40,7 +40,7 @@

Generates a density grid with or without a priori defined limits

-

Generates a density grid that can then be used for heatmap or countour plots.

+

Generates a density grid that can then be used for heatmap or contour plots.

diff --git a/docs/reference/dmtC2SDS.html b/docs/reference/dmtC2SDS.html index f76845d2..27c7f867 100644 --- a/docs/reference/dmtC2SDS.html +++ b/docs/reference/dmtC2SDS.html @@ -97,13 +97,13 @@

Arguments

colnames.transmit
-

a parser-transmissable vector specifying the name of each column +

a parser-transmissible vector specifying the name of each column in the DMT being transferred from clientside to serverside. Generated automatically by clientside function from colnames of clientside DMT.

colclass.transmit
-

a parser-transmissable vector specifying the class of the +

a parser-transmissible vector specifying the class of the vector representing each individual column in the DMT to be transferred. Generated automatically by clientside function. This allows the transmission of DMTs containing columns with different classes.If something is going to go wrong with diff --git a/docs/reference/gamlssDS.html b/docs/reference/gamlssDS.html index 4d9a36eb..75d9f900 100644 --- a/docs/reference/gamlssDS.html +++ b/docs/reference/gamlssDS.html @@ -1,5 +1,5 @@ -gamlssDS an aggregate function called by ds.galmss — gamlssDS • dsBase

diff --git a/docs/reference/glmerSLMADS.assign.html b/docs/reference/glmerSLMADS.assign.html index a73e9bed..489acdd4 100644 --- a/docs/reference/glmerSLMADS.assign.html +++ b/docs/reference/glmerSLMADS.assign.html @@ -129,7 +129,7 @@

Details

The analytic work engine is the glmer function in R which sits in the lme4 package. glmerSLMADS.assign fits a generalized linear mixed effects model (glme) - e.g. a logistic or Poisson regression model including both fixed and random effects - on data -from each single data source and saves the regression outcomes on the serveside.

+from each single data source and saves the regression outcomes on the serverside.

Author

diff --git a/docs/reference/hetcorDS.html b/docs/reference/hetcorDS.html index 990d44a9..d12ec828 100644 --- a/docs/reference/hetcorDS.html +++ b/docs/reference/hetcorDS.html @@ -93,7 +93,7 @@

Value

Details

-

Computes a heterogenous correlation matrix, consisting of Pearson product-moment +

Computes a heterogeneous correlation matrix, consisting of Pearson product-moment correlations between numeric variables, polyserial correlations between numeric and ordinal variables, and polychoric correlations between ordinal variables.

diff --git a/docs/reference/index.html b/docs/reference/index.html index 78275f79..7c6dd126 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -208,7 +208,7 @@

All functions

gamlssDS()

-

gamlssDS an aggregate function called by ds.galmss

+

gamlssDS an aggregate function called by ds.gamlss

getWGSRDS()

@@ -372,7 +372,7 @@

All functions

meanDS()

-

Computes statistical mean of a vectores

+

Computes statistical mean of a vector

meanSdGpDS()

diff --git a/docs/reference/lexisDS2.html b/docs/reference/lexisDS2.html index dd0bcb45..23318275 100644 --- a/docs/reference/lexisDS2.html +++ b/docs/reference/lexisDS2.html @@ -111,7 +111,7 @@

Value

Details

This is the assign function which actually creates -the expanded dataframe containing surival data for a piecewise exponential +the expanded dataframe containing survival data for a piecewise exponential regression. lexisDS2 also carries out a series of disclosure checks and if the arguments or data fail any of those tests, diff --git a/docs/reference/lmerSLMADS.assign.html b/docs/reference/lmerSLMADS.assign.html index a2a8de6a..89fffdec 100644 --- a/docs/reference/lmerSLMADS.assign.html +++ b/docs/reference/lmerSLMADS.assign.html @@ -1,5 +1,5 @@ -Fitting linear mixed effect models - serverside function — lmerSLMADS.assign • dsBaseFitting linear mixed effect models - serverside function — lmerSLMADS.assign • dsBaseComputes statistical mean of a vectores — meanDS • dsBaseComputes statistical mean of a vector — meanDS • dsBase @@ -34,7 +34,7 @@

diff --git a/docs/reference/metadataDS.html b/docs/reference/metadataDS.html index ab6418f8..34504ffa 100644 --- a/docs/reference/metadataDS.html +++ b/docs/reference/metadataDS.html @@ -58,7 +58,7 @@

Arguments

Value

a list containing the metadata. The elements of the list will depend -on the meatadata available.

+on the metadata available.

Details

diff --git a/docs/reference/qlsplineDS.html b/docs/reference/qlsplineDS.html index a5d91f0f..8954d3f2 100644 --- a/docs/reference/qlsplineDS.html +++ b/docs/reference/qlsplineDS.html @@ -63,7 +63,7 @@

Arguments

q

numeric, a single scalar greater or equal to 2 for a number of equal-frequency -intervals along x or a vector of numbers in (0; 1) specifying the quantiles explicitely.

+intervals along x or a vector of numbers in (0; 1) specifying the quantiles explicitly.

na.rm
diff --git a/docs/reference/repDS.html b/docs/reference/repDS.html index 0896a168..95c45702 100644 --- a/docs/reference/repDS.html +++ b/docs/reference/repDS.html @@ -87,7 +87,7 @@

Arguments

length.out.transmit

This argument fixes the length of -the output repetive sequence vector +the output repetitive sequence vector For behaviour see help for ds.rep and "details from native R help for <rep>" (see above). This parameter is usually fully defined by the argument <length.out> in the call to ds.rep that itself calls repDS.

diff --git a/docs/reference/rmDS.html b/docs/reference/rmDS.html index 19b20773..2c85bbbd 100644 --- a/docs/reference/rmDS.html +++ b/docs/reference/rmDS.html @@ -53,7 +53,7 @@

Arguments

x.names.transmit,

the names of the objects to be deleted converted -into transmissable form, a comma seperated list of character string. The +into transmissible form, a comma separated list of character string. The argument is specified via the <x.names> argument of ds.rm

diff --git a/docs/reference/table1DDS.html b/docs/reference/table1DDS.html index e1dd9566..5dc7a17a 100644 --- a/docs/reference/table1DDS.html +++ b/docs/reference/table1DDS.html @@ -67,7 +67,7 @@

Details

It generates a 1-dimensional tables where valid (non-disclosive) 1-dimensional tables are defined as data from sources where no table cells have counts between 1 and the set threshold. When the output table is invalid all cells but the total count are replaced by missing values. Only the total count is visible -on the table returned to the client site. A message is also returned with the 1-dimensional; the message +on the table returned to the client side. A message is also returned with the 1-dimensional; the message says "invalid table - invalid counts present" if the table is invalid and 'valid table' otherwise.

diff --git a/docs/reference/tableDS.assign.html b/docs/reference/tableDS.assign.html index a5abb4fa..e71aae2b 100644 --- a/docs/reference/tableDS.assign.html +++ b/docs/reference/tableDS.assign.html @@ -63,21 +63,21 @@

Arguments

rvar.transmit
-

is a character string (in inverted commas) specifiying the +

is a character string (in inverted commas) specifying the name of the variable defining the rows in all of the 2 dimensional tables that form the output. Fully specified by <rvar> argument in ds.table. For more information see help for ds.table

cvar.transmit
-

is a character string specifiying the +

is a character string specifying the name of the variable defining the columns in all of the 2 dimensional tables that form the output. Fully specified by <cvar> argument in ds.table. For more information see help for ds.table

stvar.transmit
-

is a character string specifiying the +

is a character string specifying the name of the variable that indexes the separate two dimensional tables in the output if the call specifies a 3 dimensional table. Fully specified by <stvar> argument in ds.table. diff --git a/docs/reference/tableDS.html b/docs/reference/tableDS.html index 2026c164..dcfc8cc7 100644 --- a/docs/reference/tableDS.html +++ b/docs/reference/tableDS.html @@ -64,21 +64,21 @@

Arguments

rvar.transmit
-

is a character string (in inverted commas) specifiying the +

is a character string (in inverted commas) specifying the name of the variable defining the rows in all of the 2 dimensional tables that form the output. Fully specified by <rvar> argument in ds.table. For more information see help for ds.table

cvar.transmit
-

is a character string specifiying the +

is a character string specifying the name of the variable defining the columns in all of the 2 dimensional tables that form the output. Fully specified by <cvar> argument in ds.table. For more information see help for ds.table

stvar.transmit
-

is a character string specifiying the +

is a character string specifying the name of the variable that indexes the separate two dimensional tables in the output if the call specifies a 3 dimensional table. Fully specified by <stvar> argument in ds.table. diff --git a/docs/reference/tableDS2.html b/docs/reference/tableDS2.html index 8b777e9f..2fe4186d 100644 --- a/docs/reference/tableDS2.html +++ b/docs/reference/tableDS2.html @@ -63,21 +63,21 @@

Arguments

rvar.transmit
-

is a character string (in inverted commas) specifiying the +

is a character string (in inverted commas) specifying the name of the variable defining the rows in all of the 2 dimensional tables that form the output. Fully specified by <rvar> argument in ds.table. For more information see help for ds.table

cvar.transmit
-

is a character string specifiying the +

is a character string specifying the name of the variable defining the columns in all of the 2 dimensional tables that form the output. Fully specified by <cvar> argument in ds.table. For more information see help for ds.table

stvar.transmit
-

is a character string specifiying the +

is a character string specifying the name of the variable that indexes the separate two dimensional tables in the output if the call specifies a 3 dimensional table. Fully specified by <stvar> argument in ds.table. diff --git a/man/asDataMatrixDS.Rd b/man/asDataMatrixDS.Rd index 1a87b0d2..3170e9af 100644 --- a/man/asDataMatrixDS.Rd +++ b/man/asDataMatrixDS.Rd @@ -24,7 +24,7 @@ class for all columns in data.frames. \details{ This assign function is based on the native R function \code{data.matrix} If applied to a data.frame, the native R function \code{as.matrix} -coverts all columns into character class. In contrast, if applied to +converts all columns into character class. In contrast, if applied to a data.frame the native R function \code{data.matrix} converts the data.frame to a matrix but maintains all data columns in their original class diff --git a/man/checkNegValueDS.Rd b/man/checkNegValueDS.Rd index e06e28ef..a811eaaf 100644 --- a/man/checkNegValueDS.Rd +++ b/man/checkNegValueDS.Rd @@ -16,7 +16,7 @@ a boolean; TRUE if the vector has one or more negative values and FALSE otherwis this function is only called by the client function \code{ds.glm}. } \details{ -if a user sets the parameter 'weights' on the client site function \code{ds.glm} this +if a user sets the parameter 'weights' on the client side function \code{ds.glm} this server side function is called to verify that the 'weights' vector does not have negative values because no negative are allowed in weights. } diff --git a/man/densityGridDS.Rd b/man/densityGridDS.Rd index ea18a3b0..2b254acf 100644 --- a/man/densityGridDS.Rd +++ b/man/densityGridDS.Rd @@ -38,7 +38,7 @@ If \code{limits} is set to "TRUE", limits defined by x.min, x.max, y.min and y.m a grid density matrix } \description{ -Generates a density grid that can then be used for heatmap or countour plots. +Generates a density grid that can then be used for heatmap or contour plots. } \details{ Invalid cells (cells with count < to the set filter value for the minimum allowed diff --git a/man/dmtC2SDS.Rd b/man/dmtC2SDS.Rd index 102d3859..524f82f0 100644 --- a/man/dmtC2SDS.Rd +++ b/man/dmtC2SDS.Rd @@ -40,11 +40,11 @@ the clientside DMT to be transferred.} Fixed by the clientside function as equal to the number of columns in the clientside DMT to be transferred.} -\item{colnames.transmit}{a parser-transmissable vector specifying the name of each column +\item{colnames.transmit}{a parser-transmissible vector specifying the name of each column in the DMT being transferred from clientside to serverside. Generated automatically by clientside function from colnames of clientside DMT.} -\item{colclass.transmit}{a parser-transmissable vector specifying the class of the +\item{colclass.transmit}{a parser-transmissible vector specifying the class of the vector representing each individual column in the DMT to be transferred. Generated automatically by clientside function. This allows the transmission of DMTs containing columns with different classes.If something is going to go wrong with diff --git a/man/gamlssDS.Rd b/man/gamlssDS.Rd index f4cb1568..218eb4ac 100644 --- a/man/gamlssDS.Rd +++ b/man/gamlssDS.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/gamlssDS.R \name{gamlssDS} \alias{gamlssDS} -\title{gamlssDS an aggregate function called by ds.galmss} +\title{gamlssDS an aggregate function called by ds.gamlss} \usage{ gamlssDS( formula = formula, diff --git a/man/glmerSLMADS.assign.Rd b/man/glmerSLMADS.assign.Rd index f40c8f05..6db1196d 100644 --- a/man/glmerSLMADS.assign.Rd +++ b/man/glmerSLMADS.assign.Rd @@ -63,7 +63,7 @@ glmerSLMADS.assign is a serverside function called by ds.glmerSLMA on the client The analytic work engine is the glmer function in R which sits in the lme4 package. glmerSLMADS.assign fits a generalized linear mixed effects model (glme) - e.g. a logistic or Poisson regression model including both fixed and random effects - on data -from each single data source and saves the regression outcomes on the serveside. +from each single data source and saves the regression outcomes on the serverside. } \author{ Demetris Avraam for DataSHIELD Development Team diff --git a/man/hetcorDS.Rd b/man/hetcorDS.Rd index 3af57873..2745ce65 100644 --- a/man/hetcorDS.Rd +++ b/man/hetcorDS.Rd @@ -38,7 +38,7 @@ FALSE for two-step estimates. This function is based on the hetcor function from the R package \code{polycor}. } \details{ -Computes a heterogenous correlation matrix, consisting of Pearson product-moment +Computes a heterogeneous correlation matrix, consisting of Pearson product-moment correlations between numeric variables, polyserial correlations between numeric and ordinal variables, and polychoric correlations between ordinal variables. } diff --git a/man/lexisDS2.Rd b/man/lexisDS2.Rd index 9b943bb1..51ca6851 100644 --- a/man/lexisDS2.Rd +++ b/man/lexisDS2.Rd @@ -52,7 +52,7 @@ The second serverside function called by ds.lexis. \details{ This is the assign function which actually creates -the expanded dataframe containing surival data for a piecewise exponential +the expanded dataframe containing survival data for a piecewise exponential regression. lexisDS2 also carries out a series of disclosure checks and if the arguments or data fail any of those tests, diff --git a/man/lmerSLMADS.assign.Rd b/man/lmerSLMADS.assign.Rd index eb8c34bd..cc2ff9f0 100644 --- a/man/lmerSLMADS.assign.Rd +++ b/man/lmerSLMADS.assign.Rd @@ -41,14 +41,14 @@ writes lmerMod object summarising the fitted model to the serverside. For more detailed information see help for ds.lmerSLMA. } \description{ -lmerSLMADS.assing is the same as lmerSLMADS2 which fits a linear +lmerSLMADS.assign is the same as lmerSLMADS2 which fits a linear mixed effects model (lme) per study and saves the outcomes in each study } \details{ lmerSLMADS.assign is a serverside function called by ds.lmerSLMA on the clientside. The analytic work engine is the lmer function in R which sits in the lme4 package. lmerSLMADS.assign fits a linear mixed effects model (lme) including both fixed and random -effects - on data from each single data source and saves the regression outcomes on the serveside. +effects - on data from each single data source and saves the regression outcomes on the serverside. } \author{ TDemetris Avraam for DataSHIELD Development Team diff --git a/man/meanDS.Rd b/man/meanDS.Rd index 94e1d7c8..6802ad58 100644 --- a/man/meanDS.Rd +++ b/man/meanDS.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/meanDS.R \name{meanDS} \alias{meanDS} -\title{Computes statistical mean of a vectores} +\title{Computes statistical mean of a vector} \usage{ meanDS(xvect) } diff --git a/man/metadataDS.Rd b/man/metadataDS.Rd index 0c636b46..f7749090 100644 --- a/man/metadataDS.Rd +++ b/man/metadataDS.Rd @@ -11,7 +11,7 @@ metadataDS(x) } \value{ a list containing the metadata. The elements of the list will depend -on the meatadata available. +on the metadata available. } \description{ This function returns metadata, if any, about specified variable. diff --git a/man/qlsplineDS.Rd b/man/qlsplineDS.Rd index cdf88ddd..aa14326a 100644 --- a/man/qlsplineDS.Rd +++ b/man/qlsplineDS.Rd @@ -10,7 +10,7 @@ qlsplineDS(x = x, q = q, na.rm = TRUE, marginal = FALSE, names = NULL) \item{x}{the name of the input numeric variable} \item{q}{numeric, a single scalar greater or equal to 2 for a number of equal-frequency -intervals along x or a vector of numbers in (0; 1) specifying the quantiles explicitely.} +intervals along x or a vector of numbers in (0; 1) specifying the quantiles explicitly.} \item{na.rm}{logical, whether NA should be removed when calculating quantiles, passed to na.rm of quantile. Default set to TRUE.} diff --git a/man/repDS.Rd b/man/repDS.Rd index 5d410418..306e2aec 100644 --- a/man/repDS.Rd +++ b/man/repDS.Rd @@ -30,7 +30,7 @@ help for " (see above). This parameter is usually fully defined by the argument in the call to \code{ds.rep} that itself calls \code{repDS}.} \item{length.out.transmit}{This argument fixes the length of -the output repetive sequence vector +the output repetitive sequence vector For behaviour see help for \code{ds.rep} and "details from native R help for " (see above). This parameter is usually fully defined by the argument in the call to \code{ds.rep} that itself calls \code{repDS}.} diff --git a/man/rmDS.Rd b/man/rmDS.Rd index 18d85255..f4d13286 100644 --- a/man/rmDS.Rd +++ b/man/rmDS.Rd @@ -8,7 +8,7 @@ rmDS(x.names.transmit) } \arguments{ \item{x.names.transmit, }{the names of the objects to be deleted converted -into transmissable form, a comma seperated list of character string. The +into transmissible form, a comma separated list of character string. The argument is specified via the argument of ds.rm} } \value{ diff --git a/man/table1DDS.Rd b/man/table1DDS.Rd index 950ff239..98bb8750 100644 --- a/man/table1DDS.Rd +++ b/man/table1DDS.Rd @@ -21,7 +21,7 @@ This function generates a 1-dimensional table where potentially disclosive cells It generates a 1-dimensional tables where valid (non-disclosive) 1-dimensional tables are defined as data from sources where no table cells have counts between 1 and the set threshold. When the output table is invalid all cells but the total count are replaced by missing values. Only the total count is visible -on the table returned to the client site. A message is also returned with the 1-dimensional; the message +on the table returned to the client side. A message is also returned with the 1-dimensional; the message says "invalid table - invalid counts present" if the table is invalid and 'valid table' otherwise. } \author{ diff --git a/man/tableDS.Rd b/man/tableDS.Rd index a6ac5a45..752eb815 100644 --- a/man/tableDS.Rd +++ b/man/tableDS.Rd @@ -18,17 +18,17 @@ tableDS( ) } \arguments{ -\item{rvar.transmit}{is a character string (in inverted commas) specifiying the +\item{rvar.transmit}{is a character string (in inverted commas) specifying the name of the variable defining the rows in all of the 2 dimensional tables that form the output. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{cvar.transmit}{is a character string specifiying the +\item{cvar.transmit}{is a character string specifying the name of the variable defining the columns in all of the 2 dimensional tables that form the output. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{stvar.transmit}{is a character string specifiying the +\item{stvar.transmit}{is a character string specifying the name of the variable that indexes the separate two dimensional tables in the output if the call specifies a 3 dimensional table. Fully specified by argument in \code{ds.table}. diff --git a/man/tableDS.assign.Rd b/man/tableDS.assign.Rd index 7a79e36a..8214ab3d 100644 --- a/man/tableDS.assign.Rd +++ b/man/tableDS.assign.Rd @@ -17,17 +17,17 @@ tableDS.assign( ) } \arguments{ -\item{rvar.transmit}{is a character string (in inverted commas) specifiying the +\item{rvar.transmit}{is a character string (in inverted commas) specifying the name of the variable defining the rows in all of the 2 dimensional tables that form the output. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{cvar.transmit}{is a character string specifiying the +\item{cvar.transmit}{is a character string specifying the name of the variable defining the columns in all of the 2 dimensional tables that form the output. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{stvar.transmit}{is a character string specifiying the +\item{stvar.transmit}{is a character string specifying the name of the variable that indexes the separate two dimensional tables in the output if the call specifies a 3 dimensional table. Fully specified by argument in \code{ds.table}. diff --git a/man/tableDS2.Rd b/man/tableDS2.Rd index 38f6c5e8..86e27027 100644 --- a/man/tableDS2.Rd +++ b/man/tableDS2.Rd @@ -15,17 +15,17 @@ is nevertheless TRUE, the name for the serverside table object defaults to 'newObj'. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{rvar.transmit}{is a character string (in inverted commas) specifiying the +\item{rvar.transmit}{is a character string (in inverted commas) specifying the name of the variable defining the rows in all of the 2 dimensional tables that form the output. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{cvar.transmit}{is a character string specifiying the +\item{cvar.transmit}{is a character string specifying the name of the variable defining the columns in all of the 2 dimensional tables that form the output. Fully specified by argument in \code{ds.table}. For more information see help for \code{ds.table}} -\item{stvar.transmit}{is a character string specifiying the +\item{stvar.transmit}{is a character string specifying the name of the variable that indexes the separate two dimensional tables in the output if the call specifies a 3 dimensional table. Fully specified by argument in \code{ds.table}. From 03cb1c36d02c185c78564fa5d53737bc40a74c8e Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 20 Aug 2025 17:19:37 +0100 Subject: [PATCH 088/148] Update parts of docs --- README.md | 4 ++-- docs/index.html | 12 ++++++------ docs/pkgdown.yml | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0e9eace1..b844fcfe 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.4.0 with the following -remotes::install_github("datashield/dsBase", "v6.4.0-dev") +# Install v6.3.4 with the following +remotes::install_github("datashield/dsBase", "6.3.4") ``` For a full list of development branches, checkout https://github.com/datashield/dsBase/branches diff --git a/docs/index.html b/docs/index.html index 18cfb110..41a8674e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -72,8 +72,8 @@

Installationinstall.packages("remotes") remotes::install_github("datashield/dsBase", "<BRANCH>") -# Install v6.4.0 with the following -remotes::install_github("datashield/dsBase", "v6.4.0-dev")

+# Install v6.3.4 with the following +remotes::install_github("datashield/dsBase", "6.3.4")

For a full list of development branches, checkout https://github.com/datashield/dsBase/branches

@@ -86,20 +86,20 @@

About - + Location What is it? - + obiba CRAN Where you probably should install DataSHIELD from. - + releases Stable releases. - + master branch Mostly in sync with the latest release, changes rarely. diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 50a63ee4..cc41cd15 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,5 @@ -pandoc: '3.4' +pandoc: 3.1.3 pkgdown: 2.1.3 pkgdown_sha: ~ articles: {} -last_built: 2025-08-20T15:00Z +last_built: 2025-08-20T16:17Z From 675dc5fed0e99019d82b84cbb077c387d4c1b5ef Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 21 Aug 2025 07:38:02 +0100 Subject: [PATCH 089/148] Set up language for the package (en-GB) and add list of word exceptions --- DESCRIPTION | 2 + inst/WORDLIST | 327 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 329 insertions(+) create mode 100644 inst/WORDLIST diff --git a/DESCRIPTION b/DESCRIPTION index 2732c4db..756074fb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -73,6 +73,8 @@ Imports: mice, childsds Suggests: + spelling, testthat RoxygenNote: 7.3.2 Encoding: UTF-8 +Language: en-GB diff --git a/inst/WORDLIST b/inst/WORDLIST new file mode 100644 index 00000000..23ca495f --- /dev/null +++ b/inst/WORDLIST @@ -0,0 +1,327 @@ +Aguirre +BMI +Banerjee +Boniol +BooleDS +Bota +Budin +CG +Cederkvist +Codecov +DDS +DF +DMT +DMTs +DataSHIELD +Demir +Dibben +Doiron +Duijts +Escribà +Ferretti +Fortier +GAMLSS +Giepmans +GlobalEnv +González +Gonçalves +HC +Haakma +Hartlev +Hasenauer +Heuvel +Hiekkalinna +Huth +Hveem +Inf +Isaeva +Jaddoe +Knoppers +Kvaløy +LaFlamme +Ljøsne +MUAC +Macleod +Mayrhofer +MeanSdGpDS +Millar +Molnar +Montagut +Murtagh +Nuotio +Nybo +Perola +Poisson +Polychoric +Polyserial +R's +RS +Reischl +Ryser +SDS +SDs +SLMA +SSF +Schwarz +Serverside +Severside +Stasinopoulos +Stolk +Strandberg +Swertz +TBL +TDemetris +TSF +Tedds +WGS +Waldenberger +Welten +Woffenbuttel +Zbp +ag +asDataMatrix +asDataMatrixDS +asFactor +asFactorSimple +asList +asListDS +ascharacter +asdatamatrix +asinteger +auc +aucDS +bfa +blackBox +blackBoxDS +blackBoxRanksDS +blackbox +booleans +bp +byrow +casewise +cbind +cbindDS +cbinded +cbinding +centile +centiles +checkPermissivePrivacyControlLevel +childsds +clientside +colMeans +colSums +completeCases +completeCasesDS +crit +cs +cvar +cyc +dataFrame +dataFrameDS +dataFrameFill +dataFrameFillDS +dataFrameShort +dataFrameSort +dataFrameSortDS +dataFrameSubset +dataFrameSubsetDS +dataName +dataframesort +datashield +datasource +datasources +deKlerk +defaultMethod +df +dfdata +diag +disclosive +dmtC +ds +dsBaseClient +dups +eg +elspline +etc +extractQuantileDS +extractQuantiles +extractQuantilesDS +fixef +gamlss +gamlssDS +gd +ggplot +glm +glmDS +glmPredict +glmSLMA +glmSLMADS +glmSummary +glmSummaryDS +glme +glmer +glmerMod +glmerSLMA +glmerSLMADS +glmes +glmname +hca +hcircm +hetcor +hfa +idvar +igb +imputationSet +incomparables +inout +kendall +lencm +lexisDS +lfa +listDisclosureSettings +listDisclosureSettingsDS +lme +lmer +lmerMod +lmerSLMA +lmerSLMADS +lmerSLMDS +lmes +loess +lspline +manag +matdftbl +matrixDS +matrixDet +matrixDetDS +matrixDiag +matrixDiagDS +matrixDimnames +matrixDimnamesDS +matrixInvert +matrixInvertDS +matrixMult +matrixMultDS +matrixTranspose +matrixTransposeDS +maxit +mdata +meanSdGp +mergeDS +messageDS +messageobj +metafor +mfa +mids +misspecifications +modeling +mxn +mxp +nAGQ +namesDS +ncol +ncols +nearPD +newObj +newObject +newdataname +newobj +nfilter +nrows +num +nxp +obiba +obj +obs +param +pb +pearson +perc +poisson +polychoric +polyserial +predictorMatrix +privacyControlLevel +prob +probs +pseudodata +qlspline +quatric +rBinom +rBinomDS +rNorm +rNormDS +rPois +rPoisDS +rUnif +rUnifDS +ra +ranksSecure +ranksSecureDS +rbindDS +rbinded +rbinom +rd +reShape +reShapeDS +recodeValues +recodeValuesDS +repDS +rm +rmDS +rnorm +rowMeans +rowSums +rpois +runif +rvar +sR +samp +sampleDS +sbp +sd +sds +seedtext +sep +seq +seqDS +serverside +serversideMessage +setSeed +setSeedDS +setSeedDs +smallCellsRule +spearman +ssa +studyid +studysideMessage +studysideMessages +stvar +subtable +tableDS +tapply +tapplyDS +testObjExists +testObjExistsDS +th +tibble +timevar +tol +tsa +unList +uniques +unlist +useNA +val +vals +var +vect +wfa +wfh +wfl +wlr +wtkg +xvect +yvect +zscore +zscores From a198f9fb115a09dad736200a0770f967fc57b44f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 21 Aug 2025 08:01:18 +0100 Subject: [PATCH 090/148] Add documentation for package, ?dsBase --- R/dsBase-package.R | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 R/dsBase-package.R diff --git a/R/dsBase-package.R b/R/dsBase-package.R new file mode 100644 index 00000000..a65cf643 --- /dev/null +++ b/R/dsBase-package.R @@ -0,0 +1,6 @@ +#' @keywords internal +"_PACKAGE" + +## usethis namespace: start +## usethis namespace: end +NULL From e3f0b13fb16c9130b4f4f1bc9afb9b076028ddc0 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 21 Aug 2025 08:02:19 +0100 Subject: [PATCH 091/148] Regenerate documentationa after setting up default language, en-GB --- docs/404.html | 2 +- docs/LICENSE.html | 2 +- docs/authors.html | 2 +- docs/index.html | 10 +-- docs/pkgdown.yml | 4 +- 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 +- .../reference/boxPlotGG_data_TreatmentDS.html | 2 +- .../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 +- .../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 | 87 +++++++++++++++++++ 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/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 +- docs/sitemap.xml | 1 + man/dsBase-package.Rd | 31 +++++++ 142 files changed, 263 insertions(+), 144 deletions(-) create mode 100644 docs/reference/dsBase-package.html create mode 100644 man/dsBase-package.Rd diff --git a/docs/404.html b/docs/404.html index 8ba2804e..bd9ca2cd 100644 --- a/docs/404.html +++ b/docs/404.html @@ -1,5 +1,5 @@ - + diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 39bf3d39..f075675a 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -1,5 +1,5 @@ -NA • dsBaseNA • dsBase diff --git a/docs/authors.html b/docs/authors.html index ce342a9f..0b165dc3 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -1,5 +1,5 @@ -Authors and Citation • dsBaseAuthors and Citation • dsBase diff --git a/docs/index.html b/docs/index.html index 41a8674e..3bed0dab 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,5 +1,5 @@ - + @@ -86,20 +86,20 @@

About - + Location What is it? - + obiba CRAN Where you probably should install DataSHIELD from. - + releases Stable releases. - + master branch Mostly in sync with the latest release, changes rarely. diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index cc41cd15..9659989b 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,5 @@ -pandoc: 3.1.3 +pandoc: '3.4' pkgdown: 2.1.3 pkgdown_sha: ~ articles: {} -last_built: 2025-08-20T16:17Z +last_built: 2025-08-21T06:49Z diff --git a/docs/reference/BooleDS.html b/docs/reference/BooleDS.html index bb394a66..e99c093a 100644 --- a/docs/reference/BooleDS.html +++ b/docs/reference/BooleDS.html @@ -1,5 +1,5 @@ -BooleDS — BooleDS • dsBaseBooleDS — BooleDS • dsBaseComputes the absolute values of the input variable — absDS • dsBaseComputes the absolute values of the input variable — absDS • dsBase diff --git a/docs/reference/asCharacterDS.html b/docs/reference/asCharacterDS.html index 51833330..ad7fee82 100644 --- a/docs/reference/asCharacterDS.html +++ b/docs/reference/asCharacterDS.html @@ -1,5 +1,5 @@ -Coerces an R object into class character — asCharacterDS • dsBaseCoerces an R object into class character — asCharacterDS • dsBase diff --git a/docs/reference/asDataMatrixDS.html b/docs/reference/asDataMatrixDS.html index 6129cec8..043d39ca 100644 --- a/docs/reference/asDataMatrixDS.html +++ b/docs/reference/asDataMatrixDS.html @@ -1,5 +1,5 @@ -asDataMatrixDS a serverside assign function called by ds.asDataMatrix — asDataMatrixDS • dsBaseasDataMatrixDS a serverside assign function called by ds.asDataMatrix — asDataMatrixDS • dsBaseDetermines the levels of the input variable in each single study — asFactorDS1 • dsBaseDetermines the levels of the input variable in each single study — asFactorDS1 • dsBaseConverts a numeric vector into a factor — asFactorDS2 • dsBaseConverts a numeric vector into a factor — asFactorDS2 • dsBaseConverts a numeric vector into a factor — asFactorSimpleDS • dsBaseConverts a numeric vector into a factor — asFactorSimpleDS • dsBaseCoerces an R object into class integer — asIntegerDS • dsBaseCoerces an R object into class integer — asIntegerDS • dsBase diff --git a/docs/reference/asListDS.html b/docs/reference/asListDS.html index ee8394dd..65cdc968 100644 --- a/docs/reference/asListDS.html +++ b/docs/reference/asListDS.html @@ -1,5 +1,5 @@ -asListDS a serverside aggregate function called by ds.asList — asListDS • dsBaseasListDS a serverside aggregate function called by ds.asList — asListDS • dsBase diff --git a/docs/reference/asLogicalDS.html b/docs/reference/asLogicalDS.html index 4c7a59d7..1f6ab041 100644 --- a/docs/reference/asLogicalDS.html +++ b/docs/reference/asLogicalDS.html @@ -1,5 +1,5 @@ -Coerces an R object into class numeric — asLogicalDS • dsBaseCoerces an R object into class numeric — asLogicalDS • dsBase diff --git a/docs/reference/asMatrixDS.html b/docs/reference/asMatrixDS.html index 90654e71..24e13348 100644 --- a/docs/reference/asMatrixDS.html +++ b/docs/reference/asMatrixDS.html @@ -1,5 +1,5 @@ -Coerces an R object into a matrix — asMatrixDS • dsBaseCoerces an R object into a matrix — asMatrixDS • dsBase diff --git a/docs/reference/asNumericDS.html b/docs/reference/asNumericDS.html index 844e98de..9f8e3871 100644 --- a/docs/reference/asNumericDS.html +++ b/docs/reference/asNumericDS.html @@ -1,5 +1,5 @@ -Coerces an R object into class numeric — asNumericDS • dsBaseCoerces an R object into class numeric — asNumericDS • dsBase diff --git a/docs/reference/aucDS.html b/docs/reference/aucDS.html index 91866482..d031f39e 100644 --- a/docs/reference/aucDS.html +++ b/docs/reference/aucDS.html @@ -1,5 +1,5 @@ -aucDS an aggregate function called by ds.auc — aucDS • dsBaseaucDS an aggregate function called by ds.auc — aucDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — blackBoxDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — blackBoxDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — blackBoxRanksDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — blackBoxRanksDS • dsBaseCreate the identity stats and necessary data to draw a plot on the client — boxPlotGGDS • dsBaseCreate the identity stats and necessary data to draw a plot on the client — boxPlotGGDS • dsBaseArrange data frame to pass it to the boxplot function — boxPlotGG_data_TreatmentDS • dsBaseArrange data frame to pass it to the boxplot function — boxPlotGG_data_TreatmentDS • dsBase diff --git a/docs/reference/boxPlotGG_data_Treatment_numericDS.html b/docs/reference/boxPlotGG_data_Treatment_numericDS.html index 3cdb19eb..7d6902ab 100644 --- a/docs/reference/boxPlotGG_data_Treatment_numericDS.html +++ b/docs/reference/boxPlotGG_data_Treatment_numericDS.html @@ -1,5 +1,5 @@ -Arrange vector to pass it to the boxplot function — boxPlotGG_data_Treatment_numericDS • dsBaseArrange vector to pass it to the boxplot function — boxPlotGG_data_Treatment_numericDS • dsBase diff --git a/docs/reference/bp_standardsDS.html b/docs/reference/bp_standardsDS.html index b2d91c0a..18406769 100644 --- a/docs/reference/bp_standardsDS.html +++ b/docs/reference/bp_standardsDS.html @@ -1,5 +1,5 @@ -Calculates Blood pressure z-scores — bp_standardsDS • dsBaseCalculates Blood pressure z-scores — bp_standardsDS • dsBaseConcatenates objects into a vector or list — cDS • dsBaseConcatenates objects into a vector or list — cDS • dsBase diff --git a/docs/reference/cbindDS.html b/docs/reference/cbindDS.html index 0e7ecd7c..c4be7c18 100644 --- a/docs/reference/cbindDS.html +++ b/docs/reference/cbindDS.html @@ -1,5 +1,5 @@ -cbindDS called by ds.cbind — cbindDS • dsBasecbindDS called by ds.cbind — cbindDS • dsBaseChanges a reference level of a factor — changeRefGroupDS • dsBaseChanges a reference level of a factor — changeRefGroupDS • dsBase diff --git a/docs/reference/checkNegValueDS.html b/docs/reference/checkNegValueDS.html index b40e7520..f96f4e41 100644 --- a/docs/reference/checkNegValueDS.html +++ b/docs/reference/checkNegValueDS.html @@ -1,5 +1,5 @@ -Checks if a numeric variable has negative values — checkNegValueDS • dsBaseChecks if a numeric variable has negative values — checkNegValueDS • dsBase diff --git a/docs/reference/checkPermissivePrivacyControlLevel.html b/docs/reference/checkPermissivePrivacyControlLevel.html index 0600bbdd..e6efd045 100644 --- a/docs/reference/checkPermissivePrivacyControlLevel.html +++ b/docs/reference/checkPermissivePrivacyControlLevel.html @@ -1,5 +1,5 @@ -checkPermissivePrivacyControlLevel — checkPermissivePrivacyControlLevel • dsBasecheckPermissivePrivacyControlLevel — checkPermissivePrivacyControlLevel • dsBase diff --git a/docs/reference/classDS.html b/docs/reference/classDS.html index 8deec4b1..71412168 100644 --- a/docs/reference/classDS.html +++ b/docs/reference/classDS.html @@ -1,5 +1,5 @@ -Returns the class of an object — classDS • dsBaseReturns the class of an object — classDS • dsBase diff --git a/docs/reference/colnamesDS.html b/docs/reference/colnamesDS.html index 4a28c26c..e1132722 100644 --- a/docs/reference/colnamesDS.html +++ b/docs/reference/colnamesDS.html @@ -1,5 +1,5 @@ -Returns the column names of a data frame or matrix — colnamesDS • dsBaseReturns the column names of a data frame or matrix — colnamesDS • dsBase diff --git a/docs/reference/completeCasesDS.html b/docs/reference/completeCasesDS.html index 01ab8569..56845bf1 100644 --- a/docs/reference/completeCasesDS.html +++ b/docs/reference/completeCasesDS.html @@ -1,5 +1,5 @@ -completeCasesDS: an assign function called by ds.completeCases — completeCasesDS • dsBasecompleteCasesDS: an assign function called by ds.completeCases — completeCasesDS • dsBaseComputes the sum of each variable and the sum of products for each pair of variables — corDS • dsBaseComputes the sum of each variable and the sum of products for each pair of variables — corDS • dsBaseTests for correlation between paired samples — corTestDS • dsBaseTests for correlation between paired samples — corTestDS • dsBase diff --git a/docs/reference/covDS.html b/docs/reference/covDS.html index 0fde5f83..63be57ee 100644 --- a/docs/reference/covDS.html +++ b/docs/reference/covDS.html @@ -1,5 +1,5 @@ -Computes the sum of each variable and the sum of products for each pair of variables — covDS • dsBaseComputes the sum of each variable and the sum of products for each pair of variables — covDS • dsBasedataFrameDS called by ds.dataFrame — dataFrameDS • dsBasedataFrameDS called by ds.dataFrame — dataFrameDS • dsBasedataFrameFillDS — dataFrameFillDS • dsBasedataFrameFillDS — dataFrameFillDS • dsBase diff --git a/docs/reference/dataFrameSortDS.html b/docs/reference/dataFrameSortDS.html index 61c03840..47246150 100644 --- a/docs/reference/dataFrameSortDS.html +++ b/docs/reference/dataFrameSortDS.html @@ -1,5 +1,5 @@ -Sorting and reordering data frames, vectors or matrices — dataFrameSortDS • dsBaseSorting and reordering data frames, vectors or matrices — dataFrameSortDS • dsBase diff --git a/docs/reference/dataFrameSubsetDS1.html b/docs/reference/dataFrameSubsetDS1.html index 2af88052..cd201b50 100644 --- a/docs/reference/dataFrameSubsetDS1.html +++ b/docs/reference/dataFrameSubsetDS1.html @@ -1,5 +1,5 @@ -dataFrameSubsetDS1 an aggregate function called by ds.dataFrameSubset — dataFrameSubsetDS1 • dsBasedataFrameSubsetDS1 an aggregate function called by ds.dataFrameSubset — dataFrameSubsetDS1 • dsBase diff --git a/docs/reference/dataFrameSubsetDS2.html b/docs/reference/dataFrameSubsetDS2.html index 13fa4212..66dc97f6 100644 --- a/docs/reference/dataFrameSubsetDS2.html +++ b/docs/reference/dataFrameSubsetDS2.html @@ -1,5 +1,5 @@ -dataFrameSubsetDS2 an assign function called by ds.dataFrameSubset — dataFrameSubsetDS2 • dsBasedataFrameSubsetDS2 an assign function called by ds.dataFrameSubset — dataFrameSubsetDS2 • dsBase diff --git a/docs/reference/densityGridDS.html b/docs/reference/densityGridDS.html index 6bd9d93d..14c4e7b2 100644 --- a/docs/reference/densityGridDS.html +++ b/docs/reference/densityGridDS.html @@ -1,5 +1,5 @@ -Generates a density grid with or without a priori defined limits — densityGridDS • dsBaseGenerates a density grid with or without a priori defined limits — densityGridDS • dsBase diff --git a/docs/reference/dimDS.html b/docs/reference/dimDS.html index ff787a02..ccda6820 100644 --- a/docs/reference/dimDS.html +++ b/docs/reference/dimDS.html @@ -1,5 +1,5 @@ -Returns the dimension of a data frame or matrix — dimDS • dsBaseReturns the dimension of a data frame or matrix — dimDS • dsBase diff --git a/docs/reference/dmtC2SDS.html b/docs/reference/dmtC2SDS.html index 27c7f867..df76184d 100644 --- a/docs/reference/dmtC2SDS.html +++ b/docs/reference/dmtC2SDS.html @@ -1,5 +1,5 @@ -Copy a clientside data.frame, matrix or tibble (DMT) to the serverside. — dmtC2SDS • dsBaseCopy a clientside data.frame, matrix or tibble (DMT) to the serverside. — dmtC2SDS • dsBasedsBase: 'DataSHIELD' Server Side Base Functions — dsBase-package • dsBase + + +
+
+ + + +
+
+ + +
+

Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a software package which allows you to do non-disclosive federated analysis on sensitive data. 'DataSHIELD' analytic functions have 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")'.

+
+ + +
+

Author

+

Maintainer: Stuart Wheater stuart.wheater@arjuna.com (ORCID)

+

Authors:

+ +
+ +
+ + +
+ +
+

Site built with pkgdown 2.1.3.

+
+ +
+ + + + + + + + diff --git a/docs/reference/elsplineDS.html b/docs/reference/elsplineDS.html index 246ef707..190483ae 100644 --- a/docs/reference/elsplineDS.html +++ b/docs/reference/elsplineDS.html @@ -1,5 +1,5 @@ -Basis for a piecewise linear spline with meaningful coefficients — elsplineDS • dsBaseBasis for a piecewise linear spline with meaningful coefficients — elsplineDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources and use of these ranks to estimate global quantiles across all studies — extractQuantilesDS1 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources and use of these ranks to estimate global quantiles across all studies — extractQuantilesDS1 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources and use of these ranks to estimate global quantiles across all studies — extractQuantilesDS2 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources and use of these ranks to estimate global quantiles across all studies — extractQuantilesDS2 • dsBasegamlssDS an aggregate function called by ds.gamlss — gamlssDS • dsBase -Computes the WHO Growth Reference z-scores of anthropometric data — getWGSRDS • dsBaseComputes the WHO Growth Reference z-scores of anthropometric data — getWGSRDS • dsBaseglmDS1 called by ds.glm — glmDS1 • dsBaseglmDS1 called by ds.glm — glmDS1 • dsBase diff --git a/docs/reference/glmDS2.html b/docs/reference/glmDS2.html index e3a9088b..71ccd910 100644 --- a/docs/reference/glmDS2.html +++ b/docs/reference/glmDS2.html @@ -1,5 +1,5 @@ -glmDS2 called by ds.glm — glmDS2 • dsBaseglmDS2 called by ds.glm — glmDS2 • dsBase diff --git a/docs/reference/glmPredictDS.ag.html b/docs/reference/glmPredictDS.ag.html index 88224724..f99f1f21 100644 --- a/docs/reference/glmPredictDS.ag.html +++ b/docs/reference/glmPredictDS.ag.html @@ -1,5 +1,5 @@ -predict regression responses from a glm object — glmPredictDS.ag • dsBasepredict regression responses from a glm object — glmPredictDS.ag • dsBasepredict regression responses from a glm object — glmPredictDS.as • dsBasepredict regression responses from a glm object — glmPredictDS.as • dsBaseFit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — glmSLMADS.assign • dsBaseFit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — glmSLMADS.assign • dsBaseFit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — glmSLMADS1 • dsBaseFit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — glmSLMADS1 • dsBaseFit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — glmSLMADS2 • dsBaseFit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — glmSLMADS2 • dsBasesummarize a glm object on the serverside — glmSummaryDS.ag • dsBasesummarize a glm object on the serverside — glmSummaryDS.ag • dsBasesummarize a glm object on the serverside — glmSummaryDS.as • dsBasesummarize a glm object on the serverside — glmSummaryDS.as • dsBaseFitting generalized linear mixed effect models - serverside function — glmerSLMADS.assign • dsBaseFitting generalized linear mixed effect models - serverside function — glmerSLMADS.assign • dsBaseFitting generalized linear mixed effect models - serverside function — glmerSLMADS2 • dsBaseFitting generalized linear mixed effect models - serverside function — glmerSLMADS2 • dsBaseCalculates the coordinates of the centroid of each n nearest neighbours — heatmapPlotDS • dsBaseCalculates the coordinates of the centroid of each n nearest neighbours — heatmapPlotDS • dsBase diff --git a/docs/reference/hetcorDS.html b/docs/reference/hetcorDS.html index d12ec828..ac02df16 100644 --- a/docs/reference/hetcorDS.html +++ b/docs/reference/hetcorDS.html @@ -1,5 +1,5 @@ -Heterogeneous Correlation Matrix — hetcorDS • dsBaseHeterogeneous Correlation Matrix — hetcorDS • dsBase diff --git a/docs/reference/histogramDS1.html b/docs/reference/histogramDS1.html index a9e7b356..dfae6675 100644 --- a/docs/reference/histogramDS1.html +++ b/docs/reference/histogramDS1.html @@ -1,5 +1,5 @@ -returns the minimum and the maximum of the input numeric vector — histogramDS1 • dsBasereturns the minimum and the maximum of the input numeric vector — histogramDS1 • dsBaseComputes a histogram of the input variable without plotting. — histogramDS2 • dsBaseComputes a histogram of the input variable without plotting. — histogramDS2 • dsBaseConverts birth measurements to intergrowth z-scores/centiles — igb_standardsDS • dsBaseConverts birth measurements to intergrowth z-scores/centiles — igb_standardsDS • dsBase diff --git a/docs/reference/index.html b/docs/reference/index.html index 7c6dd126..59255ef6 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -1,5 +1,5 @@ -Package index • dsBasePackage index • dsBase diff --git a/docs/reference/isNaDS.html b/docs/reference/isNaDS.html index dbfb140c..06080e50 100644 --- a/docs/reference/isNaDS.html +++ b/docs/reference/isNaDS.html @@ -1,5 +1,5 @@ -Checks if a vector is empty — isNaDS • dsBaseChecks if a vector is empty — isNaDS • dsBaseChecks if an input is valid — isValidDS • dsBaseChecks if an input is valid — isValidDS • dsBase diff --git a/docs/reference/kurtosisDS1.html b/docs/reference/kurtosisDS1.html index 18f70f62..d65a39fb 100644 --- a/docs/reference/kurtosisDS1.html +++ b/docs/reference/kurtosisDS1.html @@ -1,5 +1,5 @@ -Calculates the kurtosis of a numeric variable — kurtosisDS1 • dsBaseCalculates the kurtosis of a numeric variable — kurtosisDS1 • dsBase diff --git a/docs/reference/kurtosisDS2.html b/docs/reference/kurtosisDS2.html index b43cd157..7758f44c 100644 --- a/docs/reference/kurtosisDS2.html +++ b/docs/reference/kurtosisDS2.html @@ -1,5 +1,5 @@ -Calculates the kurtosis of a numeric variable — kurtosisDS2 • dsBaseCalculates the kurtosis of a numeric variable — kurtosisDS2 • dsBaseReturns the length of a vector or list — lengthDS • dsBaseReturns the length of a vector or list — lengthDS • dsBase diff --git a/docs/reference/levelsDS.html b/docs/reference/levelsDS.html index b535bd7a..5d7163fb 100644 --- a/docs/reference/levelsDS.html +++ b/docs/reference/levelsDS.html @@ -1,5 +1,5 @@ -Returns the levels of a factor vector — levelsDS • dsBaseReturns the levels of a factor vector — levelsDS • dsBase diff --git a/docs/reference/lexisDS1.html b/docs/reference/lexisDS1.html index 65381e78..acf40341 100644 --- a/docs/reference/lexisDS1.html +++ b/docs/reference/lexisDS1.html @@ -1,5 +1,5 @@ -lexisDS1 — lexisDS1 • dsBaselexisDS1 — lexisDS1 • dsBase diff --git a/docs/reference/lexisDS2.html b/docs/reference/lexisDS2.html index 23318275..203d290c 100644 --- a/docs/reference/lexisDS2.html +++ b/docs/reference/lexisDS2.html @@ -1,5 +1,5 @@ -lexisDS2 — lexisDS2 • dsBaselexisDS2 — lexisDS2 • dsBase diff --git a/docs/reference/lexisDS3.html b/docs/reference/lexisDS3.html index c2513381..c16502f5 100644 --- a/docs/reference/lexisDS3.html +++ b/docs/reference/lexisDS3.html @@ -1,5 +1,5 @@ -@title lexisDS3 — lexisDS3 • dsBase@title lexisDS3 — lexisDS3 • dsBase diff --git a/docs/reference/listDS.html b/docs/reference/listDS.html index d6962b85..517bff8d 100644 --- a/docs/reference/listDS.html +++ b/docs/reference/listDS.html @@ -1,5 +1,5 @@ -Coerce objects into a list — listDS • dsBaseCoerce objects into a list — listDS • dsBase diff --git a/docs/reference/listDisclosureSettingsDS.html b/docs/reference/listDisclosureSettingsDS.html index 554e51cd..2f6252fa 100644 --- a/docs/reference/listDisclosureSettingsDS.html +++ b/docs/reference/listDisclosureSettingsDS.html @@ -1,5 +1,5 @@ -listDisclosureSettingsDS — listDisclosureSettingsDS • dsBaselistDisclosureSettingsDS — listDisclosureSettingsDS • dsBaseFitting linear mixed effect models - serverside function — lmerSLMADS.assign • dsBaseFitting linear mixed effect models - serverside function — lmerSLMADS.assign • dsBaseFitting linear mixed effect models - serverside function — lmerSLMADS2 • dsBaseFitting linear mixed effect models - serverside function — lmerSLMADS2 • dsBaselists all objects on a serverside environment — lsDS • dsBaselists all objects on a serverside environment — lsDS • dsBaseBasis for a piecewise linear spline with meaningful coefficients — lsplineDS • dsBaseBasis for a piecewise linear spline with meaningful coefficients — lsplineDS • dsBasematrixDS assign function called by ds.matrix — matrixDS • dsBasematrixDS assign function called by ds.matrix — matrixDS • dsBase diff --git a/docs/reference/matrixDetDS1.html b/docs/reference/matrixDetDS1.html index b4da1887..63f81b79 100644 --- a/docs/reference/matrixDetDS1.html +++ b/docs/reference/matrixDetDS1.html @@ -1,5 +1,5 @@ -matrixDetDS aggregate function called by ds.matrixDet.report — matrixDetDS1 • dsBasematrixDetDS aggregate function called by ds.matrixDet.report — matrixDetDS1 • dsBasematrixDetDS assign function called by ds.matrixDet — matrixDetDS2 • dsBasematrixDetDS assign function called by ds.matrixDet — matrixDetDS2 • dsBasematrixDiagDS assign function called by ds.matrixDiag — matrixDiagDS • dsBasematrixDiagDS assign function called by ds.matrixDiag — matrixDiagDS • dsBasematrixDimnamesDS assign function called by ds.matrixDimnames — matrixDimnamesDS • dsBasematrixDimnamesDS assign function called by ds.matrixDimnames — matrixDimnamesDS • dsBasematrixInvertDS serverside assign function called by ds.matrixInvert — matrixInvertDS • dsBasematrixInvertDS serverside assign function called by ds.matrixInvert — matrixInvertDS • dsBase diff --git a/docs/reference/matrixMultDS.html b/docs/reference/matrixMultDS.html index eefb7112..8bae8648 100644 --- a/docs/reference/matrixMultDS.html +++ b/docs/reference/matrixMultDS.html @@ -1,5 +1,5 @@ -matrixMultDS serverside assign function called by ds.matrixMult — matrixMultDS • dsBasematrixMultDS serverside assign function called by ds.matrixMult — matrixMultDS • dsBase diff --git a/docs/reference/matrixTransposeDS.html b/docs/reference/matrixTransposeDS.html index a1d02f7e..fc9337f2 100644 --- a/docs/reference/matrixTransposeDS.html +++ b/docs/reference/matrixTransposeDS.html @@ -1,5 +1,5 @@ -matrixTransposeDS serverside assign function called by ds.matrixTranspose — matrixTransposeDS • dsBasematrixTransposeDS serverside assign function called by ds.matrixTranspose — matrixTransposeDS • dsBase diff --git a/docs/reference/meanDS.html b/docs/reference/meanDS.html index 62d29d65..e8946d90 100644 --- a/docs/reference/meanDS.html +++ b/docs/reference/meanDS.html @@ -1,5 +1,5 @@ -Computes statistical mean of a vector — meanDS • dsBaseComputes statistical mean of a vector — meanDS • dsBase diff --git a/docs/reference/meanSdGpDS.html b/docs/reference/meanSdGpDS.html index bc8825d1..44cf811b 100644 --- a/docs/reference/meanSdGpDS.html +++ b/docs/reference/meanSdGpDS.html @@ -1,5 +1,5 @@ -MeanSdGpDS — meanSdGpDS • dsBaseMeanSdGpDS — meanSdGpDS • dsBase diff --git a/docs/reference/mergeDS.html b/docs/reference/mergeDS.html index f97d682c..5cbb47cc 100644 --- a/docs/reference/mergeDS.html +++ b/docs/reference/mergeDS.html @@ -1,5 +1,5 @@ -mergeDS (assign function) called by ds.merge — mergeDS • dsBasemergeDS (assign function) called by ds.merge — mergeDS • dsBasemessageDS — messageDS • dsBasemessageDS — messageDS • dsBaseReturns the metadata, if any, about the specified variable — metadataDS • dsBaseReturns the metadata, if any, about the specified variable — metadataDS • dsBase diff --git a/docs/reference/miceDS.html b/docs/reference/miceDS.html index 6f8c57b9..9457e5a8 100644 --- a/docs/reference/miceDS.html +++ b/docs/reference/miceDS.html @@ -1,5 +1,5 @@ -Aggregate function called by ds.mice — miceDS • dsBaseAggregate function called by ds.mice — miceDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — minMaxRandDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — minMaxRandDS • dsBaseReturn the names of a list object — namesDS • dsBaseReturn the names of a list object — namesDS • dsBase diff --git a/docs/reference/nsDS.html b/docs/reference/nsDS.html index 65d02e21..03822097 100644 --- a/docs/reference/nsDS.html +++ b/docs/reference/nsDS.html @@ -1,5 +1,5 @@ -Generate a Basis Matrix for Natural Cubic Splines — nsDS • dsBaseGenerate a Basis Matrix for Natural Cubic Splines — nsDS • dsBaseCounts the number of missing values — numNaDS • dsBaseCounts the number of missing values — numNaDS • dsBaseBasis for a piecewise linear spline with meaningful coefficients — qlsplineDS • dsBaseBasis for a piecewise linear spline with meaningful coefficients — qlsplineDS • dsBaseGenerates quantiles and mean information without maximum and minimum — quantileMeanDS • dsBaseGenerates quantiles and mean information without maximum and minimum — quantileMeanDS • dsBaserBinomDS serverside assign function — rBinomDS • dsBaserBinomDS serverside assign function — rBinomDS • dsBase diff --git a/docs/reference/rNormDS.html b/docs/reference/rNormDS.html index 35e47dfc..7720f286 100644 --- a/docs/reference/rNormDS.html +++ b/docs/reference/rNormDS.html @@ -1,5 +1,5 @@ -rNormDS serverside assign function — rNormDS • dsBaserNormDS serverside assign function — rNormDS • dsBase diff --git a/docs/reference/rPoisDS.html b/docs/reference/rPoisDS.html index 82595f81..c560901e 100644 --- a/docs/reference/rPoisDS.html +++ b/docs/reference/rPoisDS.html @@ -1,5 +1,5 @@ -rPoisDS serverside assign function — rPoisDS • dsBaserPoisDS serverside assign function — rPoisDS • dsBase diff --git a/docs/reference/rUnifDS.html b/docs/reference/rUnifDS.html index 77495f76..7af321e6 100644 --- a/docs/reference/rUnifDS.html +++ b/docs/reference/rUnifDS.html @@ -1,5 +1,5 @@ -rUnifDS serverside assign function — rUnifDS • dsBaserUnifDS serverside assign function — rUnifDS • dsBase diff --git a/docs/reference/rangeDS.html b/docs/reference/rangeDS.html index b5687859..fb661e2f 100644 --- a/docs/reference/rangeDS.html +++ b/docs/reference/rangeDS.html @@ -1,5 +1,5 @@ -returns the minimum and maximum of a numeric vector — rangeDS • dsBasereturns the minimum and maximum of a numeric vector — rangeDS • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS1 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS1 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS2 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS2 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS3 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS3 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS4 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS5 • dsBaseSecure ranking of "V2BR" (vector to be ranked) across all sources — ranksSecureDS5 • dsBaserbindDS called by ds.rbind — rbindDS • dsBaserbindDS called by ds.rbind — rbindDS • dsBasereShapeDS (assign function) called by ds.reShape — reShapeDS • dsBasereShapeDS (assign function) called by ds.reShape — reShapeDS • dsBaseRecodes the levels of a categorical variables — recodeLevelsDS • dsBaseRecodes the levels of a categorical variables — recodeLevelsDS • dsBaserecodeValuesDS an assign function called by ds.recodeValues — recodeValuesDS • dsBaserecodeValuesDS an assign function called by ds.recodeValues — recodeValuesDS • dsBaserepDS called by ds.rep — repDS • dsBaserepDS called by ds.rep — repDS • dsBaseReplaces the missing values in a vector — replaceNaDS • dsBaseReplaces the missing values in a vector — replaceNaDS • dsBasermDS an aggregate function called by ds.rm — rmDS • dsBasermDS an aggregate function called by ds.rm — rmDS • dsBase diff --git a/docs/reference/rowColCalcDS.html b/docs/reference/rowColCalcDS.html index ea332ea6..2e657383 100644 --- a/docs/reference/rowColCalcDS.html +++ b/docs/reference/rowColCalcDS.html @@ -1,5 +1,5 @@ -Computes sums and means of rows or columns of numeric arrays — rowColCalcDS • dsBaseComputes sums and means of rows or columns of numeric arrays — rowColCalcDS • dsBaserandom sampling and permuting of vectors, dataframes and matrices — sampleDS • dsBaserandom sampling and permuting of vectors, dataframes and matrices — sampleDS • dsBaseCalculates the coordinates of the data to be plot — scatterPlotDS • dsBaseCalculates the coordinates of the data to be plot — scatterPlotDS • dsBaseseqDS a serverside assign function called by ds.seq — seqDS • dsBaseseqDS a serverside assign function called by ds.seq — seqDS • dsBase diff --git a/docs/reference/setSeedDS.html b/docs/reference/setSeedDS.html index 525ddf79..4e49ec86 100644 --- a/docs/reference/setSeedDS.html +++ b/docs/reference/setSeedDS.html @@ -1,5 +1,5 @@ -setSeedDs called by ds.setSeed, ds.rNorm, ds.rUnif, ds.rPois and ds.rBinom — setSeedDS • dsBasesetSeedDs called by ds.setSeed, ds.rNorm, ds.rUnif, ds.rPois and ds.rBinom — setSeedDS • dsBaseCalculates the skewness of a numeric variable — skewnessDS1 • dsBaseCalculates the skewness of a numeric variable — skewnessDS1 • dsBase diff --git a/docs/reference/skewnessDS2.html b/docs/reference/skewnessDS2.html index ef93b35e..f86c7490 100644 --- a/docs/reference/skewnessDS2.html +++ b/docs/reference/skewnessDS2.html @@ -1,5 +1,5 @@ -Calculates the skewness of a numeric variable — skewnessDS2 • dsBaseCalculates the skewness of a numeric variable — skewnessDS2 • dsBaseComputes the square root values of the input variable — sqrtDS • dsBaseComputes the square root values of the input variable — sqrtDS • dsBase diff --git a/docs/reference/subsetByClassDS.html b/docs/reference/subsetByClassDS.html index 06507b87..92b0197c 100644 --- a/docs/reference/subsetByClassDS.html +++ b/docs/reference/subsetByClassDS.html @@ -1,5 +1,5 @@ -Breaks down a dataframe or a factor into its sub-classes — subsetByClassDS • dsBaseBreaks down a dataframe or a factor into its sub-classes — subsetByClassDS • dsBaseGenerates a valid subset of a table or a vector — subsetDS • dsBaseGenerates a valid subset of a table or a vector — subsetDS • dsBaseCreates 1-dimensional contingency tables — table1DDS • dsBaseCreates 1-dimensional contingency tables — table1DDS • dsBasetable2DDS (aggregate function) called by ds.table2D — table2DDS • dsBasetable2DDS (aggregate function) called by ds.table2D — table2DDS • dsBasetableDS.assign is the serverside assign function called by ds.table — tableDS.assign • dsBasetableDS.assign is the serverside assign function called by ds.table — tableDS.assign • dsBasetableDS is the first of two serverside aggregate functions called by ds.table — tableDS • dsBasetableDS is the first of two serverside aggregate functions called by ds.table — tableDS • dsBasetableDS is the second of two serverside aggregate functions called by ds.table — tableDS2 • dsBasetableDS is the second of two serverside aggregate functions called by ds.table — tableDS2 • dsBasetapplyDS.assign called by ds.tapply.assign — tapplyDS.assign • dsBasetapplyDS.assign called by ds.tapply.assign — tapplyDS.assign • dsBasetapplyDS called by ds.tapply — tapplyDS • dsBasetapplyDS called by ds.tapply — tapplyDS • dsBasetestObjExistsDS — testObjExistsDS • dsBasetestObjExistsDS — testObjExistsDS • dsBase diff --git a/docs/reference/unListDS.html b/docs/reference/unListDS.html index 2bc79c42..d7b8aaf4 100644 --- a/docs/reference/unListDS.html +++ b/docs/reference/unListDS.html @@ -1,5 +1,5 @@ -unListDS a serverside assign function called by ds.unList — unListDS • dsBaseunListDS a serverside assign function called by ds.unList — unListDS • dsBaseApplies the unique method to a server-side variable. — uniqueDS • dsBaseApplies the unique method to a server-side variable. — uniqueDS • dsBase diff --git a/docs/reference/varDS.html b/docs/reference/varDS.html index 7e785dd6..37a4d212 100644 --- a/docs/reference/varDS.html +++ b/docs/reference/varDS.html @@ -1,5 +1,5 @@ -Computes the variance of vector — varDS • dsBaseComputes the variance of vector — varDS • dsBase diff --git a/docs/reference/vectorDS.html b/docs/reference/vectorDS.html index 4da45050..c7cca023 100644 --- a/docs/reference/vectorDS.html +++ b/docs/reference/vectorDS.html @@ -1,5 +1,5 @@ -Creates a vector on the server-side. — vectorDS • dsBaseCreates a vector on the server-side. — vectorDS • dsBase diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 265de84e..04ef332c 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -41,6 +41,7 @@ /reference/densityGridDS.html /reference/dimDS.html /reference/dmtC2SDS.html +/reference/dsBase-package.html /reference/elsplineDS.html /reference/extract.html /reference/extractQuantilesDS1.html diff --git a/man/dsBase-package.Rd b/man/dsBase-package.Rd new file mode 100644 index 00000000..725c4131 --- /dev/null +++ b/man/dsBase-package.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dsBase-package.R +\docType{package} +\name{dsBase-package} +\alias{dsBase} +\alias{dsBase-package} +\title{dsBase: 'DataSHIELD' Server Side Base Functions} +\description{ +Base 'DataSHIELD' functions for the server side. 'DataSHIELD' is a software package which allows you to do non-disclosive federated analysis on sensitive data. 'DataSHIELD' analytic functions have 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")'. +} +\author{ +\strong{Maintainer}: Stuart Wheater \email{stuart.wheater@arjuna.com} (\href{https://orcid.org/0009-0003-2419-1964}{ORCID}) + +Authors: +\itemize{ + \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}) + \item Patricia Ryser-Welch (\href{https://orcid.org/0000-0002-0070-0264}{ORCID}) + \item Alex Westerberg + \item Leire Abarrategui + \item Roberto Villegas-Diaz (\href{https://orcid.org/0000-0001-5036-8661}{ORCID}) + \item Demetris Avraam (\href{https://orcid.org/0000-0001-8908-2441}{ORCID}) + \item Yannick Marcon \email{yannick.marcon@obiba.org} (\href{https://orcid.org/0000-0003-0138-2023}{ORCID}) + \item Tom Bishop + \item Amadou Gaye (\href{https://orcid.org/0000-0002-1180-2792}{ORCID}) + \item Xavier Escribà-Montagut (\href{https://orcid.org/0000-0003-2888-8948}{ORCID}) +} + +} +\keyword{internal} From a9f1ae20dcc5e05221c53fad7abfdc03a8815180 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 21 Aug 2025 08:04:09 +0100 Subject: [PATCH 092/148] Update version to match next release --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b844fcfe..c6a1ad5f 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Detailed instructions on how to install DataSHIELD are at https://wiki.datashiel [1] 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 (2025). _dsBase: 'DataSHIELD' Server Side Base Functions_. R - package version 6.3.3. . + package version 6.3.4. . [2] 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, From 1260e0b0a2ef3158e259a7fb2a5c6d528a51bb32 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 21 Aug 2025 08:31:06 +0100 Subject: [PATCH 093/148] Update dsBase test suite workflow to be executed on pull_requests and change author of results to be committed to generic 'github-actions[bot]', instead of '$GITHUB_ACTOR' --- .github/workflows/dsBase_test_suite.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 00b230a4..ecfcda15 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -13,10 +13,11 @@ name: dsBase tests' suite on: push: - branches: [master, v6.3.4-dev] + branches: [master] schedule: - cron: '0 0 * * 0' # Weekly - cron: '0 1 * * *' # Nightly + pull_request: jobs: dsBase_test_suite: @@ -153,10 +154,9 @@ jobs: working-directory: dsBase - name: Commit results to testStatus - # if: github.repository == 'villegar/dsBase' && github.event_name != 'pull_request' run: | - git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com" - git config --global user.name "$GITHUB_ACTOR" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" cd testStatus git checkout master git pull From 57905f3dfa5b4cdf654de0b4e4b664830547bd99 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Thu, 21 Aug 2025 08:42:19 +0100 Subject: [PATCH 094/148] Remove on pull_request as secrets.GH_TOKEN is not available in this context. Alternatively, pull_request_target could be used, but it could be exploited to get access to other repos in the organisation, so won't be used. Remove the filter of branches for on push, so it runs when pushing to any branch. --- .github/workflows/dsBase_test_suite.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index ecfcda15..2a8fa619 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -13,11 +13,9 @@ name: dsBase tests' suite on: push: - branches: [master] schedule: - cron: '0 0 * * 0' # Weekly - cron: '0 1 * * *' # Nightly - pull_request: jobs: dsBase_test_suite: From 23620214842407dc595f7df4ef3b0a34003b3969 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 22 Aug 2025 09:40:33 +0100 Subject: [PATCH 095/148] Remove flag skip_on_os to skip these tests on Apple M1 architecture. Add new conditional tests to account for numeric precision on the Apple M1 architecture (.Machine$sizeof.longdouble = 8) in comparison with other architectures --- tests/testthat/test-smk-corTestDS.R | 31 +++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R index ba2560e8..0a32dba5 100644 --- a/tests/testthat/test-smk-corTestDS.R +++ b/tests/testthat/test-smk-corTestDS.R @@ -12,9 +12,6 @@ # Set up # -# Skip these tests on Apple M1 mac -skip_on_os("mac", arch = "aarch64") - context("corTestDS::smk::setup") # @@ -201,7 +198,32 @@ test_that("simple corTestDS, some, with na, pearson", { expect_equal(class(res$`Correlation test`$statistic), "numeric") expect_length(res$`Correlation test`$statistic, 1) - expect_true(is.infinite(res$`Correlation test`$statistic[[1]])) + + # extract information from the results + t_stat <- res$`Correlation test`$statistic[[1]] + df <- res$`Number of pairwise complete cases` + # re-calculate the value for r (correlation) + ## t_stat <- sqrt(df) * r / sqrt(1 - r^2) # Equation 1 + ## calculate intermediate coefficient, derived from Equation 1 + A <- t_stat / sqrt(df) + ## use the intermediate value to estimate the correlation value, r + r <- sqrt(A^2 / (1 + A^2)) + + # if testing on Apple M1: due to numeric precision + if (getElement(Sys.info(), "sysname") == "Darwin" && + getElement(R.version, "arch") == "aarch64") { + # lower tolerance, expect failure, due to numeric precision + expect_error(expect_equal(r, 1L, tolerance = 1E-16)) + # higher tolerance, expect success + expect_equal(r, 1L, tolerance = 1E-8) + } + else { # other architectures + expect_true(is.infinite(res$`Correlation test`$statistic[[1]])) + # lower tolerance, expect success + expect_equal(r, 1L, tolerance = 1E-16) + # higher tolerance, expect success + expect_equal(r, 1L, tolerance = 1E-8) + } expect_equal(class(res$`Correlation test`$parameter), "integer") expect_length(res$`Correlation test`$parameter, 1) @@ -611,3 +633,4 @@ test_that("simple corTestDS, some, with na, spearman", { context("corTestDS::smk::shutdown") context("corTestDS::smk::done") + From d3e78af438561e3459763e19dd6cdf3f2adc8d8b Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 22 Aug 2025 09:54:56 +0100 Subject: [PATCH 096/148] Remove invalid test for when the approximation of t-stat is Inf, resulting in a NaN value for the estimated r --- tests/testthat/test-smk-corTestDS.R | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R index 0a32dba5..cacd0a96 100644 --- a/tests/testthat/test-smk-corTestDS.R +++ b/tests/testthat/test-smk-corTestDS.R @@ -218,11 +218,9 @@ test_that("simple corTestDS, some, with na, pearson", { expect_equal(r, 1L, tolerance = 1E-8) } else { # other architectures - expect_true(is.infinite(res$`Correlation test`$statistic[[1]])) - # lower tolerance, expect success - expect_equal(r, 1L, tolerance = 1E-16) - # higher tolerance, expect success - expect_equal(r, 1L, tolerance = 1E-8) + expect_true(is.infinite(t_stat)) + # the estimated value for r should NaN + expect_true(is.nan(r)) } expect_equal(class(res$`Correlation test`$parameter), "integer") From b8e80af24c6edd897553a428e1b5dbab35d7ff34 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Fri, 22 Aug 2025 16:04:36 +0100 Subject: [PATCH 097/148] Replace test for Apple Mx processors without assumptions of tolerance, this test is based on observed behaviour for the stats::cor and stats::cor.test functions, where the approximation for the correlation for some vectors is nearly 1, resulting in 1 - cor(x, y) > 0, when the expected value should be 0. For example, when x = y = c(0.0, 3.0, 7.0) --- tests/testthat/test-smk-corTestDS.R | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R index cacd0a96..55ff26de 100644 --- a/tests/testthat/test-smk-corTestDS.R +++ b/tests/testthat/test-smk-corTestDS.R @@ -201,7 +201,8 @@ test_that("simple corTestDS, some, with na, pearson", { # extract information from the results t_stat <- res$`Correlation test`$statistic[[1]] - df <- res$`Number of pairwise complete cases` + # degrees of freedom + df <- res$`Number of pairwise complete cases` - 2 # re-calculate the value for r (correlation) ## t_stat <- sqrt(df) * r / sqrt(1 - r^2) # Equation 1 ## calculate intermediate coefficient, derived from Equation 1 @@ -212,10 +213,10 @@ test_that("simple corTestDS, some, with na, pearson", { # if testing on Apple M1: due to numeric precision if (getElement(Sys.info(), "sysname") == "Darwin" && getElement(R.version, "arch") == "aarch64") { - # lower tolerance, expect failure, due to numeric precision - expect_error(expect_equal(r, 1L, tolerance = 1E-16)) - # higher tolerance, expect success - expect_equal(r, 1L, tolerance = 1E-8) + # t-stat should be a very large value, because r ~ 1, but not exactly 1 + expect_false(is.infinite(t_stat)) + # r ~ 1 + expect_false(is.nan(r)) } else { # other architectures expect_true(is.infinite(t_stat)) From 9d74b2647393b1316caea7a41ca89499b1e47b9d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 26 Aug 2025 10:35:08 +0100 Subject: [PATCH 098/148] Roll back changes done to the test 'simple corTestDS, some, with na, pearson', now replacing the input x, so the version with complete cases is c(1.0, 3.0, 7.0), instead of c(0.0, 3.0, 7.0). The latter resulted in a failure when testing for Infinite value on Apple Mx processors. --- tests/testthat/test-smk-corTestDS.R | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/tests/testthat/test-smk-corTestDS.R b/tests/testthat/test-smk-corTestDS.R index 55ff26de..a36e2082 100644 --- a/tests/testthat/test-smk-corTestDS.R +++ b/tests/testthat/test-smk-corTestDS.R @@ -182,7 +182,7 @@ test_that("simple corTestDS, some, pearson, without na, pearson", { context("corTestDS::smk::with na, pearson") test_that("simple corTestDS, some, with na, pearson", { - x <- c(0.0, NA, 2.0, 3.0, NA, 5.0, NA, 7.0) + x <- c(NA, 1.0, 2.0, 3.0, NA, 5.0, NA, 7.0) y <- c(0.0, 1.0, NA, 3.0, 4.0, NA, NA, 7.0) res <- corTestDS("x", "y", "pearson", NULL, 0.95) @@ -198,31 +198,7 @@ test_that("simple corTestDS, some, with na, pearson", { expect_equal(class(res$`Correlation test`$statistic), "numeric") expect_length(res$`Correlation test`$statistic, 1) - - # extract information from the results - t_stat <- res$`Correlation test`$statistic[[1]] - # degrees of freedom - df <- res$`Number of pairwise complete cases` - 2 - # re-calculate the value for r (correlation) - ## t_stat <- sqrt(df) * r / sqrt(1 - r^2) # Equation 1 - ## calculate intermediate coefficient, derived from Equation 1 - A <- t_stat / sqrt(df) - ## use the intermediate value to estimate the correlation value, r - r <- sqrt(A^2 / (1 + A^2)) - - # if testing on Apple M1: due to numeric precision - if (getElement(Sys.info(), "sysname") == "Darwin" && - getElement(R.version, "arch") == "aarch64") { - # t-stat should be a very large value, because r ~ 1, but not exactly 1 - expect_false(is.infinite(t_stat)) - # r ~ 1 - expect_false(is.nan(r)) - } - else { # other architectures - expect_true(is.infinite(t_stat)) - # the estimated value for r should NaN - expect_true(is.nan(r)) - } + expect_true(is.infinite(res$`Correlation test`$statistic[[1]])) expect_equal(class(res$`Correlation test`$parameter), "integer") expect_length(res$`Correlation test`$parameter, 1) From e6c3bcbbf9388ad562c77c80a494fc759c82b8d1 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Thu, 28 Aug 2025 20:05:49 +0100 Subject: [PATCH 099/148] Update doc timestamps --- docs/index.html | 10 +++++----- docs/pkgdown.yml | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/index.html b/docs/index.html index 3bed0dab..68b18fc6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -86,20 +86,20 @@

About - + Location What is it? - + obiba CRAN Where you probably should install DataSHIELD from. - + releases Stable releases. - + master branch Mostly in sync with the latest release, changes rarely. @@ -109,7 +109,7 @@

About

References

-

[1] 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 (2025). dsBase: ‘DataSHIELD’ Server Side Base Functions. R package version 6.3.3. https://doi.org/10.32614/CRAN.package.dsBase.

+

[1] 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 (2025). dsBase: ‘DataSHIELD’ Server Side Base Functions. R package version 6.3.4. https://doi.org/10.32614/CRAN.package.dsBase.

[2] 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, Oliver 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.” International Journal of Epidemiology, 43(6), 1929-1944. https://doi.org/10.1093/ije/dyu188.

[3] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, R. Burton P (2017). “DataSHIELD – New Directions and Dimensions.” Data Science Journal, 16(21), 1-21. https://doi.org/10.5334/dsj-2017-021.

[4] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1-21. https://doi.org/10.1093/bioadv/vbaf046.

diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 9659989b..35b3f72f 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,5 @@ -pandoc: '3.4' +pandoc: 3.1.3 pkgdown: 2.1.3 pkgdown_sha: ~ articles: {} -last_built: 2025-08-21T06:49Z +last_built: 2025-08-28T18:48Z From 719d91840f8af9da5016c79ad7af21dc8fc19a41 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 11:45:02 +0100 Subject: [PATCH 100/148] Reconfigure script to push changes to testStatus on pull request --- .github/workflows/dsBase_test_suite.yaml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 2a8fa619..02f00394 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -156,8 +156,11 @@ jobs: git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" cd testStatus + + # Reconfigure remote to use GitHub token for authentication + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ env.REPO_OWNER }}/testStatus.git git checkout master - git pull + git pull origin master mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ @@ -178,8 +181,8 @@ jobs: cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest git add . - git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" - git push + git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" || echo "No changes to commit" + git push origin master env: PROJECT_NAME: ${{ env.PROJECT_NAME }} From 3f622e2e23a9ea789d7f4f79b714f135c070ebf1 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 12:05:17 +0100 Subject: [PATCH 101/148] Remove installation of dependencies via auto detection --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 02f00394..7930841e 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -79,7 +79,7 @@ jobs: cran::kableExtra cran::rmarkdown cran::downlit - needs: check + dependencies: NA - name: Check man files up-to-date run: | From 7fac2581bbdd31fc198865a543336950b0be4667 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 12:14:44 +0100 Subject: [PATCH 102/148] Relocate the dependencies: NA keyword --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 7930841e..5bc1d5a0 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -62,6 +62,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: + dependencies: NA # skip auto detection extra-packages: | any::rcmdcheck cran::devtools @@ -79,7 +80,6 @@ jobs: cran::kableExtra cran::rmarkdown cran::downlit - dependencies: NA - name: Check man files up-to-date run: | From 7d5be42ce04d9521546402984d4e5e466488a741 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 12:26:56 +0100 Subject: [PATCH 103/148] Minor change to dependencies value --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 5bc1d5a0..138a1bc0 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -62,7 +62,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: NA # skip auto detection + dependencies: false # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From 9827d980686838178d34480a8bf67378986bb114 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 13:06:13 +0100 Subject: [PATCH 104/148] Update unrecognised R expression false >>> 'FALSE' --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 138a1bc0..2e39c2e2 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -62,7 +62,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: false # skip auto detection + dependencies: 'FALSE' # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From 2ba2a13d9fc9e7ecf64dffbd5b6fa4547d0af105 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 13:11:56 +0100 Subject: [PATCH 105/148] Add missing dependencies for checking package, fs and usethis --- .github/workflows/dsBase_test_suite.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 2e39c2e2..8346c484 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -80,6 +80,8 @@ jobs: cran::kableExtra cran::rmarkdown cran::downlit + cran::fs + cran::usethis - name: Check man files up-to-date run: | From 41adaf84332374ef5773123cd2beb9b3a910ee55 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 13:30:13 +0100 Subject: [PATCH 106/148] Add new packages for checks: cli and rlang --- .github/workflows/dsBase_test_suite.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 8346c484..da902469 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -82,6 +82,8 @@ jobs: cran::downlit cran::fs cran::usethis + cran::cli + cran::rlang - name: Check man files up-to-date run: | From db997e96d9ff8f39e172bf4ff344205557ef5275 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 13:35:25 +0100 Subject: [PATCH 107/148] Add ellipsis and glue --- .github/workflows/dsBase_test_suite.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index da902469..509355fa 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -84,6 +84,8 @@ jobs: cran::usethis cran::cli cran::rlang + cran::ellipsis + cran::glue - name: Check man files up-to-date run: | From 7c99ea21f81df06ef154f508e6f8bfe82d3e1141 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 13:39:50 +0100 Subject: [PATCH 108/148] Add lifecycle --- .github/workflows/dsBase_test_suite.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 509355fa..5656a5f3 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -86,6 +86,7 @@ jobs: cran::rlang cran::ellipsis cran::glue + cran::lifecycle - name: Check man files up-to-date run: | From cf7f02b2f4ac113744fbcd87a7223862e97f1631 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 13:47:20 +0100 Subject: [PATCH 109/148] Add memoise and vctrs --- .github/workflows/dsBase_test_suite.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 5656a5f3..77dd5c52 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -87,6 +87,8 @@ jobs: cran::ellipsis cran::glue cran::lifecycle + cran::memoise + cran::vctrs - name: Check man files up-to-date run: | From 3df6f483f3d964854d4806732638922a9c190e6c Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 14:04:49 +0100 Subject: [PATCH 110/148] Add cachem --- .github/workflows/dsBase_test_suite.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 77dd5c52..59408c63 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -89,6 +89,7 @@ jobs: cran::lifecycle cran::memoise cran::vctrs + cran::cachem - name: Check man files up-to-date run: | From ae31b659f3aaf84276691a985bc2002aa26c0b01 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 14:14:43 +0100 Subject: [PATCH 111/148] Add fastmap --- .github/workflows/dsBase_test_suite.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 59408c63..5ed94282 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -90,6 +90,7 @@ jobs: cran::memoise cran::vctrs cran::cachem + cran::fastmap - name: Check man files up-to-date run: | From 56ea43886be0d304f08f2ec8cf69bb8e2a6e34c3 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 14:33:39 +0100 Subject: [PATCH 112/148] Add missing dependencies, extracted with pak --- .github/workflows/dsBase_test_suite.yaml | 117 +++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 5ed94282..6ebbc1db 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -91,6 +91,123 @@ jobs: cran::vctrs cran::cachem cran::fastmap + cran::miniUI + cran::admisc + cran::askpass + cran::backports + cran::bit + cran::bit64 + cran::boot + cran::broom + cran::cellranger + cran::childsds + cran::cli + cran::clipr + cran::colorspace + cran::crayon + cran::curl + cran::data.table + cran::deldir + cran::DescTools + cran::dplyr + cran::e1071 + cran::Exact + cran::expm + cran::farver + cran::forcats + cran::foreach + cran::fs + cran::gamlss + cran::gamlss.data + cran::gamlss.dist + cran::generics + cran::ggplot2 + cran::gld + cran::glmnet + cran::glue + cran::gtable + cran::haven + cran::hms + cran::httr + cran::class + cran::codetools + cran::lattice + cran::MASS + cran::mgcv + cran::nlme + cran::nnet + cran::rpart + cran::survival + cran::interp + cran::isoband + cran::iterators + cran::jomo + cran::jsonlite + cran::labeling + cran::lifecycle + cran::lme4 + cran::lmom + cran::interp + cran::isoband + cran::iterators + cran::jomo + cran::jsonlite + cran::labeling + cran::lifecycle + cran::lme4 + cran::lmom + cran::local::. + cran::lubridate + cran::magrittr + cran::Matrix + cran::mice + cran::mime + cran::minqa + cran::mitml + cran::mvtnorm + cran::nloptr + cran::numDeriv + cran::openssl + cran::ordinal + cran::pan + cran::pillar + cran::pkgconfig + cran::plyr + cran::polycor + cran::proxy + cran::purrr + cran::purrrlyr + cran::R6 + cran::RANN + cran::rbibutils + cran::RColorBrewer + cran::Rcpp + cran::Rdpack + cran::readr + cran::readxl + cran::reformulas + cran::rematch + cran::reshape2 + cran::rlang + cran::rootSolve + cran::rstudioapi + cran::scales + cran::shape + cran::stringi + cran::stringr + cran::sys + cran::tibble + cran::tidyr + cran::tidyselect + cran::timechange + cran::tzdb + cran::ucminf + cran::utf8 + cran::vctrs + cran::VGAM + cran::viridisLite + cran::vroom + cran::withr - name: Check man files up-to-date run: | From ee005940e37b1084f28184c5c8bf93b6d4710314 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 15:02:13 +0100 Subject: [PATCH 113/148] Remove dependency local::. --- .github/workflows/dsBase_test_suite.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 6ebbc1db..e91d7c60 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -156,7 +156,6 @@ jobs: cran::lifecycle cran::lme4 cran::lmom - cran::local::. cran::lubridate cran::magrittr cran::Matrix From eed38f45ae89d35539c75673c358e71de82a6d10 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 15:09:08 +0100 Subject: [PATCH 114/148] Add shiny as a dependency and remove duplicates --- .github/workflows/dsBase_test_suite.yaml | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index e91d7c60..3ab09ce1 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -80,15 +80,9 @@ jobs: cran::kableExtra cran::rmarkdown cran::downlit - cran::fs cran::usethis - cran::cli - cran::rlang cran::ellipsis - cran::glue - cran::lifecycle cran::memoise - cran::vctrs cran::cachem cran::fastmap cran::miniUI @@ -109,7 +103,6 @@ jobs: cran::data.table cran::deldir cran::DescTools - cran::dplyr cran::e1071 cran::Exact cran::expm @@ -147,17 +140,7 @@ jobs: cran::lifecycle cran::lme4 cran::lmom - cran::interp - cran::isoband - cran::iterators - cran::jomo - cran::jsonlite - cran::labeling - cran::lifecycle - cran::lme4 - cran::lmom cran::lubridate - cran::magrittr cran::Matrix cran::mice cran::mime @@ -174,7 +157,6 @@ jobs: cran::plyr cran::polycor cran::proxy - cran::purrr cran::purrrlyr cran::R6 cran::RANN @@ -182,7 +164,6 @@ jobs: cran::RColorBrewer cran::Rcpp cran::Rdpack - cran::readr cran::readxl cran::reformulas cran::rematch @@ -192,11 +173,10 @@ jobs: cran::rstudioapi cran::scales cran::shape + cran::shiny cran::stringi - cran::stringr cran::sys cran::tibble - cran::tidyr cran::tidyselect cran::timechange cran::tzdb From 5b850d08f3f23763d5e24955fb38b5e894090294 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 15:20:05 +0100 Subject: [PATCH 115/148] Add dependencies of key packages --- .github/workflows/dsBase_test_suite.yaml | 240 +++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 3ab09ce1..10d67c7e 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -86,42 +86,120 @@ jobs: cran::cachem cran::fastmap cran::miniUI + cran::abind cran::admisc + cran::AER + cran::Amelia + cran::archive cran::askpass + cran::AUC cran::backports + cran::base + cran::bbmle + cran::bench + cran::betareg + cran::biglm + cran::binGroup cran::bit cran::bit64 + cran::blob cran::boot + cran::brio cran::broom + cran::broom.mixed + cran::btergm + cran::callr + cran::car + cran::carData + cran::caret + cran::carrier + cran::cba cran::cellranger cran::childsds + cran::chron + cran::class cran::cli cran::clipr + cran::cluster + cran::cmprsk + cran::coda + cran::codetools cran::colorspace + cran::covr + cran::cpp11 cran::crayon cran::curl cran::data.table + cran::datasets + cran::DBI + cran::dbplyr + cran::debugme cran::deldir + cran::Deriv + cran::desc cran::DescTools + cran::dfoptim + cran::DiagrammeR + cran::dichromat + cran::digest + cran::disposables + cran::distributions3 + cran::doMC + cran::doParallel + cran::dplyr + cran::drc cran::e1071 + cran::emmeans + cran::epiR + cran::ergm + cran::evaluate cran::Exact + cran::ExactData cran::expm cran::farver + cran::ff + cran::fixest cran::forcats cran::foreach + cran::formattable cran::fs + cran::furrr + cran::future + cran::gam cran::gamlss cran::gamlss.data cran::gamlss.dist + cran::gamm4 + cran::gbRd + cran::gee + cran::geepack cran::generics cran::ggplot2 + cran::ggplot2movies cran::gld + cran::glmmTMB cran::glmnet + cran::glmnetUtils cran::glue + cran::gmm + cran::graph + cran::graphics + cran::grDevices + cran::grid + cran::gridExtra + cran::gt cran::gtable cran::haven + cran::here + cran::hexbin + cran::Hmisc cran::hms + cran::HSAUR3 + cran::htmltools + cran::htmlwidgets + cran::httpuv cran::httr + cran::inline cran::class cran::codetools cran::lattice @@ -132,61 +210,223 @@ jobs: cran::rpart cran::survival cran::interp + cran::irlba cran::isoband cran::iterators + cran::itertools + cran::joineRML cran::jomo + cran::jose + cran::jpeg cran::jsonlite + cran::Kendall + cran::kernlab + cran::KernSmooth + cran::knitr + cran::ks cran::labeling + cran::Lahman + cran::lars + cran::later + cran::lattice + cran::lavaan + cran::leaps + cran::lfe cran::lifecycle + cran::lintr + cran::literanger + cran::lm.beta cran::lme4 + cran::lmodel2 cran::lmom + cran::lmtest + cran::lobstr + cran::lsmeans cran::lubridate + cran::magick + cran::magrittr + cran::mapproj + cran::maps + cran::margins + cran::markdown + cran::MASS cran::Matrix + cran::mclust + cran::mediation + cran::MEMSS + cran::merDeriv + cran::metafor + cran::methods + cran::mfx + cran::mgcv cran::mice + cran::miceadds + cran::microbenchmark cran::mime cran::minqa + cran::mirai cran::mitml + cran::mitools + cran::mlbench + cran::mlmRev + cran::mlogit + cran::mockery + cran::modeldata + cran::modeltests + cran::muhaz + cran::multcomp + cran::munsell cran::mvtnorm + cran::nanotime + cran::network + cran::nlme cran::nloptr + cran::nnet cran::numDeriv + cran::nycflights13 cran::openssl + cran::optimx cran::ordinal + cran::palmerpenguins cran::pan + cran::parallel + cran::parallelly + cran::patchwork + cran::pbkrtest cran::pillar cran::pkgconfig + cran::pkgdown + cran::pkgKitten + cran::pkgload + cran::plm cran::plyr + cran::png + cran::poLCA + cran::polyclip cran::polycor + cran::prettyunits + cran::processx + cran::profvis + cran::progress cran::proxy + cran::ps + cran::psych + cran::purrr cran::purrrlyr + cran::QCA + cran::qrng + cran::quantreg + cran::R + cran::R.rsp + cran::R.utils cran::R6 + cran::ragg + cran::randomForest + cran::ranger cran::RANN + cran::rbenchmark cran::rbibutils + cran::rcartocolor cran::RColorBrewer cran::Rcpp + cran::RcppEigen + cran::RDCOMClient cran::Rdpack + cran::readr cran::readxl cran::reformulas cran::rematch + cran::repurrrsive cran::reshape2 cran::rlang + cran::rmarkdown + cran::Rmpfr + cran::RMySQL + cran::robust + cran::robustbase cran::rootSolve + cran::roxygen2 + cran::rpart + cran::RPostgreSQL + cran::rprojroot + cran::rr2 + cran::rsample + cran::RSQLite + cran::rstan cran::rstudioapi + cran::RUnit + cran::Ryacas + cran::sandwich cran::scales + cran::scatterplot3d + cran::scico + cran::semEff + cran::sf + cran::sfsmisc cran::shape cran::shiny + cran::shinyjs + cran::slam + cran::sodium + cran::sp + cran::SparseM + cran::spatialreg + cran::spdep + cran::speedglm + cran::spelling + cran::splines + cran::statmod + cran::stats + cran::stats4 cran::stringi + cran::stringr + cran::survey + cran::survival + cran::svglite cran::sys + cran::systemfit + cran::tcltk + cran::testthat cran::tibble + cran::tidyr cran::tidyselect + cran::tidyverse cran::timechange + cran::timeDate + cran::tinytest + cran::tis + cran::tools + cran::tseries cran::tzdb cran::ucminf + cran::units + cran::unix + cran::usethis cran::utf8 + cran::utils + cran::vars + cran::vcd cran::vctrs + cran::vdiffr cran::VGAM + cran::VGAMdata + cran::VGAMextra + cran::viridis cran::viridisLite cran::vroom + cran::waldo + cran::webutils + cran::wesanderson + cran::whoami + cran::winch cran::withr + cran::xfun + cran::xml2 + cran::xtable + cran::xts + cran::yaml + cran::zeallot + cran::zoo - name: Check man files up-to-date run: | From 0ed63c4e9a2d0b00631cd321b59de25dbe2ea21a Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 15:27:47 +0100 Subject: [PATCH 116/148] Update reference to dependencies --- .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 10d67c7e..567e2aab 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -154,7 +154,7 @@ jobs: cran::ergm cran::evaluate cran::Exact - cran::ExactData + any::ExactData cran::expm cran::farver cran::ff @@ -316,7 +316,6 @@ jobs: cran::QCA cran::qrng cran::quantreg - cran::R cran::R.rsp cran::R.utils cran::R6 @@ -330,7 +329,7 @@ jobs: cran::RColorBrewer cran::Rcpp cran::RcppEigen - cran::RDCOMClient + any::RDCOMClient cran::Rdpack cran::readr cran::readxl From cc265247226caa90dba9e347f1bfdc2b1668b70d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 15:52:42 +0100 Subject: [PATCH 117/148] Remove the ExactData dependency as the drat server in which is hosted doesn't seem to work --- .github/workflows/dsBase_test_suite.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 567e2aab..d08c5220 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -154,7 +154,6 @@ jobs: cran::ergm cran::evaluate cran::Exact - any::ExactData cran::expm cran::farver cran::ff @@ -329,7 +328,7 @@ jobs: cran::RColorBrewer cran::Rcpp cran::RcppEigen - any::RDCOMClient + github::omegahat/RDCOMClient cran::Rdpack cran::readr cran::readxl From 28cbdf2d479e7051037ef800326bde3dbcc6b5eb Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 16:00:51 +0100 Subject: [PATCH 118/148] Remove the RDCOMClient package --- .github/workflows/dsBase_test_suite.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index d08c5220..f9bdf40b 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -328,7 +328,6 @@ jobs: cran::RColorBrewer cran::Rcpp cran::RcppEigen - github::omegahat/RDCOMClient cran::Rdpack cran::readr cran::readxl From 0de287273b4014c4f8e0bdc4b0ecd29c3ae3e7ac Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Tue, 2 Sep 2025 16:33:33 +0100 Subject: [PATCH 119/148] Add Bioconductor dependency, BiocGenerics --- .github/workflows/dsBase_test_suite.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index f9bdf40b..8f44ff87 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -65,6 +65,7 @@ jobs: dependencies: 'FALSE' # skip auto detection extra-packages: | any::rcmdcheck + bioc::BiocGenerics cran::devtools cran::git2r cran::RCurl From 94562e4cb29a9833bf036dcaab65d73358e51f0f Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 09:29:09 +0100 Subject: [PATCH 120/148] Add generics to list of dependencies --- .github/workflows/dsBase_test_suite.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 8f44ff87..0d662929 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -66,6 +66,7 @@ jobs: extra-packages: | any::rcmdcheck bioc::BiocGenerics + cran::generics cran::devtools cran::git2r cran::RCurl From b2af53044c129b4b47c29b30cff18efdac0a4011 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 09:53:33 +0100 Subject: [PATCH 121/148] Add step for local installation of dsBase and revert changes done to the setup-r-dependencies@v2 step --- .github/workflows/dsBase_test_suite.yaml | 392 ++--------------------- 1 file changed, 27 insertions(+), 365 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 0d662929..b9abff42 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -59,373 +59,35 @@ jobs: r-version: release http-user-agent: release use-public-rspm: true - + + - name: Install dsBase + run: | + R CMD INSTALL . + with: + path: dsBase + - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: 'FALSE' # skip auto detection - extra-packages: | - any::rcmdcheck - bioc::BiocGenerics - cran::generics - cran::devtools - cran::git2r - cran::RCurl - cran::readr - cran::magrittr - cran::xml2 - cran::purrr - cran::dplyr - cran::stringr - cran::tidyr - cran::quarto - cran::knitr - cran::kableExtra - cran::rmarkdown - cran::downlit - cran::usethis - cran::ellipsis - cran::memoise - cran::cachem - cran::fastmap - cran::miniUI - cran::abind - cran::admisc - cran::AER - cran::Amelia - cran::archive - cran::askpass - cran::AUC - cran::backports - cran::base - cran::bbmle - cran::bench - cran::betareg - cran::biglm - cran::binGroup - cran::bit - cran::bit64 - cran::blob - cran::boot - cran::brio - cran::broom - cran::broom.mixed - cran::btergm - cran::callr - cran::car - cran::carData - cran::caret - cran::carrier - cran::cba - cran::cellranger - cran::childsds - cran::chron - cran::class - cran::cli - cran::clipr - cran::cluster - cran::cmprsk - cran::coda - cran::codetools - cran::colorspace - cran::covr - cran::cpp11 - cran::crayon - cran::curl - cran::data.table - cran::datasets - cran::DBI - cran::dbplyr - cran::debugme - cran::deldir - cran::Deriv - cran::desc - cran::DescTools - cran::dfoptim - cran::DiagrammeR - cran::dichromat - cran::digest - cran::disposables - cran::distributions3 - cran::doMC - cran::doParallel - cran::dplyr - cran::drc - cran::e1071 - cran::emmeans - cran::epiR - cran::ergm - cran::evaluate - cran::Exact - cran::expm - cran::farver - cran::ff - cran::fixest - cran::forcats - cran::foreach - cran::formattable - cran::fs - cran::furrr - cran::future - cran::gam - cran::gamlss - cran::gamlss.data - cran::gamlss.dist - cran::gamm4 - cran::gbRd - cran::gee - cran::geepack - cran::generics - cran::ggplot2 - cran::ggplot2movies - cran::gld - cran::glmmTMB - cran::glmnet - cran::glmnetUtils - cran::glue - cran::gmm - cran::graph - cran::graphics - cran::grDevices - cran::grid - cran::gridExtra - cran::gt - cran::gtable - cran::haven - cran::here - cran::hexbin - cran::Hmisc - cran::hms - cran::HSAUR3 - cran::htmltools - cran::htmlwidgets - cran::httpuv - cran::httr - cran::inline - cran::class - cran::codetools - cran::lattice - cran::MASS - cran::mgcv - cran::nlme - cran::nnet - cran::rpart - cran::survival - cran::interp - cran::irlba - cran::isoband - cran::iterators - cran::itertools - cran::joineRML - cran::jomo - cran::jose - cran::jpeg - cran::jsonlite - cran::Kendall - cran::kernlab - cran::KernSmooth - cran::knitr - cran::ks - cran::labeling - cran::Lahman - cran::lars - cran::later - cran::lattice - cran::lavaan - cran::leaps - cran::lfe - cran::lifecycle - cran::lintr - cran::literanger - cran::lm.beta - cran::lme4 - cran::lmodel2 - cran::lmom - cran::lmtest - cran::lobstr - cran::lsmeans - cran::lubridate - cran::magick - cran::magrittr - cran::mapproj - cran::maps - cran::margins - cran::markdown - cran::MASS - cran::Matrix - cran::mclust - cran::mediation - cran::MEMSS - cran::merDeriv - cran::metafor - cran::methods - cran::mfx - cran::mgcv - cran::mice - cran::miceadds - cran::microbenchmark - cran::mime - cran::minqa - cran::mirai - cran::mitml - cran::mitools - cran::mlbench - cran::mlmRev - cran::mlogit - cran::mockery - cran::modeldata - cran::modeltests - cran::muhaz - cran::multcomp - cran::munsell - cran::mvtnorm - cran::nanotime - cran::network - cran::nlme - cran::nloptr - cran::nnet - cran::numDeriv - cran::nycflights13 - cran::openssl - cran::optimx - cran::ordinal - cran::palmerpenguins - cran::pan - cran::parallel - cran::parallelly - cran::patchwork - cran::pbkrtest - cran::pillar - cran::pkgconfig - cran::pkgdown - cran::pkgKitten - cran::pkgload - cran::plm - cran::plyr - cran::png - cran::poLCA - cran::polyclip - cran::polycor - cran::prettyunits - cran::processx - cran::profvis - cran::progress - cran::proxy - cran::ps - cran::psych - cran::purrr - cran::purrrlyr - cran::QCA - cran::qrng - cran::quantreg - cran::R.rsp - cran::R.utils - cran::R6 - cran::ragg - cran::randomForest - cran::ranger - cran::RANN - cran::rbenchmark - cran::rbibutils - cran::rcartocolor - cran::RColorBrewer - cran::Rcpp - cran::RcppEigen - cran::Rdpack - cran::readr - cran::readxl - cran::reformulas - cran::rematch - cran::repurrrsive - cran::reshape2 - cran::rlang - cran::rmarkdown - cran::Rmpfr - cran::RMySQL - cran::robust - cran::robustbase - cran::rootSolve - cran::roxygen2 - cran::rpart - cran::RPostgreSQL - cran::rprojroot - cran::rr2 - cran::rsample - cran::RSQLite - cran::rstan - cran::rstudioapi - cran::RUnit - cran::Ryacas - cran::sandwich - cran::scales - cran::scatterplot3d - cran::scico - cran::semEff - cran::sf - cran::sfsmisc - cran::shape - cran::shiny - cran::shinyjs - cran::slam - cran::sodium - cran::sp - cran::SparseM - cran::spatialreg - cran::spdep - cran::speedglm - cran::spelling - cran::splines - cran::statmod - cran::stats - cran::stats4 - cran::stringi - cran::stringr - cran::survey - cran::survival - cran::svglite - cran::sys - cran::systemfit - cran::tcltk - cran::testthat - cran::tibble - cran::tidyr - cran::tidyselect - cran::tidyverse - cran::timechange - cran::timeDate - cran::tinytest - cran::tis - cran::tools - cran::tseries - cran::tzdb - cran::ucminf - cran::units - cran::unix - cran::usethis - cran::utf8 - cran::utils - cran::vars - cran::vcd - cran::vctrs - cran::vdiffr - cran::VGAM - cran::VGAMdata - cran::VGAMextra - cran::viridis - cran::viridisLite - cran::vroom - cran::waldo - cran::webutils - cran::wesanderson - cran::whoami - cran::winch - cran::withr - cran::xfun - cran::xml2 - cran::xtable - cran::xts - cran::yaml - cran::zeallot - cran::zoo + # dependencies: 'FALSE' # skip auto detection + with: + extra-packages: | + any::rcmdcheck + cran::devtools + cran::git2r + cran::RCurl + cran::readr + cran::magrittr + cran::xml2 + cran::purrr + cran::dplyr + cran::stringr + cran::tidyr + cran::quarto + cran::knitr + cran::kableExtra + cran::rmarkdown + cran::downlit + needs: check - name: Check man files up-to-date run: | From ccd1bb68c132859db7e593c9f2c9ebaf8aca0b1b Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 09:59:26 +0100 Subject: [PATCH 122/148] Fix invalid notation in new step --- .github/workflows/dsBase_test_suite.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index b9abff42..aeaeedf0 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -62,9 +62,7 @@ jobs: - name: Install dsBase run: | - R CMD INSTALL . - with: - path: dsBase + R CMD INSTALL dsBase - uses: r-lib/actions/setup-r-dependencies@v2 with: From 47ac437fd79d8e2c098aa739114e8ff0d3e77ef0 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:04:49 +0100 Subject: [PATCH 123/148] Simplify notation --- .github/workflows/dsBase_test_suite.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index aeaeedf0..61212fba 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -61,8 +61,7 @@ jobs: use-public-rspm: true - name: Install dsBase - run: | - R CMD INSTALL dsBase + run: R CMD INSTALL ./dsBase - uses: r-lib/actions/setup-r-dependencies@v2 with: From 41591d6154e11a1a0a97fd26b07910f0e1949e9b Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:08:07 +0100 Subject: [PATCH 124/148] Remove duplicated 'with' section --- .github/workflows/dsBase_test_suite.yaml | 37 ++++++++++++------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 61212fba..8e56dcd4 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -66,25 +66,24 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: # dependencies: 'FALSE' # skip auto detection - with: - extra-packages: | - any::rcmdcheck - cran::devtools - cran::git2r - cran::RCurl - cran::readr - cran::magrittr - cran::xml2 - cran::purrr - cran::dplyr - cran::stringr - cran::tidyr - cran::quarto - cran::knitr - cran::kableExtra - cran::rmarkdown - cran::downlit - needs: check + extra-packages: | + any::rcmdcheck + cran::devtools + cran::git2r + cran::RCurl + cran::readr + cran::magrittr + cran::xml2 + cran::purrr + cran::dplyr + cran::stringr + cran::tidyr + cran::quarto + cran::knitr + cran::kableExtra + cran::rmarkdown + cran::downlit + needs: check - name: Check man files up-to-date run: | From 3493307641545e1685d0cfc9b85074d344b1784a Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:12:24 +0100 Subject: [PATCH 125/148] Add dependencies for dsBase --- .github/workflows/dsBase_test_suite.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 8e56dcd4..d52591bf 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -61,7 +61,9 @@ jobs: use-public-rspm: true - name: Install dsBase - run: R CMD INSTALL ./dsBase + run: | + Rscript -e 'install.packages(c("RANN", "stringr", "lme4", "dplyr", "reshape2", "polycor", "gamlss", "gamlss.dist", "mice", "childsds"), dependencies = TRUE)' + R CMD INSTALL ./dsBase - uses: r-lib/actions/setup-r-dependencies@v2 with: From 617de4709ab980e80f93f1b150bb981430a8298b Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:19:36 +0100 Subject: [PATCH 126/148] Skip dependencies --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index d52591bf..1db84236 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -67,7 +67,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - # dependencies: 'FALSE' # skip auto detection + dependencies: 'FALSE' # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From e79ece234c3d618b7684a4c949d03c05da2ba1b9 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:24:04 +0100 Subject: [PATCH 127/148] Remove single quotes from dependencies: 'FALSE' --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 1db84236..bbf89f3e 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -67,7 +67,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: 'FALSE' # skip auto detection + dependencies: FALSE # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From facd06828b5e990e12a9b0f22f093c08d268a2c8 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:30:51 +0100 Subject: [PATCH 128/148] Replace FALSE by `FALSE` --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index bbf89f3e..864dd0cd 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -67,7 +67,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: FALSE # skip auto detection + dependencies: `FALSE` # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From d5c4ba2d0c63ad0624bb7c26d0eb4aec7d5d8d67 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:34:48 +0100 Subject: [PATCH 129/148] Add missing single quotes for dependencies value --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 864dd0cd..6401a585 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -67,7 +67,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: `FALSE` # skip auto detection + dependencies: '`FALSE`' # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From 4a0882aa71230e9889f88f110ea31b81a47aaf11 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:47:12 +0100 Subject: [PATCH 130/148] Fix invalid R expression pass to dependencies --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 6401a585..020a1249 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -67,7 +67,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: '`FALSE`' # skip auto detection + dependencies: "FALSE" # skip auto detection extra-packages: | any::rcmdcheck cran::devtools From 457802b4e24229a60d8221c9f2d96cdf55d9fe2d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 10:57:04 +0100 Subject: [PATCH 131/148] Replace skipping auto detection of dependencies --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 020a1249..42c7e588 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -67,7 +67,7 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - dependencies: "FALSE" # skip auto detection + dependencies: 'c("Imports")' extra-packages: | any::rcmdcheck cran::devtools From f48889bb230d3c2e9413a425354bd19e54a7fea9 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 3 Sep 2025 11:06:57 +0100 Subject: [PATCH 132/148] Add usethis and devtools --- .github/workflows/dsBase_test_suite.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml index 42c7e588..44020e83 100644 --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -62,7 +62,7 @@ jobs: - name: Install dsBase run: | - Rscript -e 'install.packages(c("RANN", "stringr", "lme4", "dplyr", "reshape2", "polycor", "gamlss", "gamlss.dist", "mice", "childsds"), dependencies = TRUE)' + Rscript -e 'install.packages(c("RANN", "stringr", "lme4", "dplyr", "reshape2", "polycor", "gamlss", "gamlss.dist", "mice", "childsds", "usethis", "devtools"), dependencies = TRUE)' R CMD INSTALL ./dsBase - uses: r-lib/actions/setup-r-dependencies@v2 From 6ba90c307807d65200b526b25616b8c03b40a387 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Fri, 5 Sep 2025 11:09:24 +0100 Subject: [PATCH 133/148] Update Roxygen to version '7.3.3' --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 756074fb..d00d8a10 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -75,6 +75,6 @@ Imports: Suggests: spelling, testthat -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Encoding: UTF-8 Language: en-GB From 83cf89ef7431ecf2d948050284b1bbc29ea8a232 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 17 Sep 2025 15:38:15 +0100 Subject: [PATCH 134/148] Addition of noLD note --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index c6a1ad5f..eed7c5ed 100644 --- a/README.md +++ b/README.md @@ -69,3 +69,13 @@ Detailed instructions on how to install DataSHIELD are at https://wiki.datashiel Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” _Bioinformatics Advances_, *5*(1), 1-21. . + +> **_Note:_** Apple Mx architecture users, please be aware that there are some numerical limitations on this platform, which leads to unexpected results when using base R packages, li> +> +> x <- c(0, 3, 7) +> +> 1 - cor(x, x)​ +> +> The above should result in a value of zero. +> +> _Also See:_ For more details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f and the bug report: https://bugs.r-project.org/sh> From 1142804c5fdf9ec42651659ee74e9e6c47fd2a60 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 17 Sep 2025 16:08:19 +0100 Subject: [PATCH 135/148] Update for noLD note --- docs/index.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/index.html b/docs/index.html index 68b18fc6..22d4d09c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -113,6 +113,13 @@

Referenceshttps://doi.org/10.1093/ije/dyu188.

[3] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, R. Burton P (2017). “DataSHIELD – New Directions and Dimensions.” Data Science Journal, 16(21), 1-21. https://doi.org/10.5334/dsj-2017-021.

[4] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1-21. https://doi.org/10.1093/bioadv/vbaf046.

+
+

Note: Apple Mx architecture users, please be aware that there are some numerical limitations on this platform, which leads to unexpected results when using base R packages, li>

+

x <- c(0, 3, 7)

+

1 - cor(x, x)​

+

The above should result in a value of zero.

+

Also See: For more details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f and the bug report: https://bugs.r-project.org/sh>

+

From c88dfc5712aad755ab7920eba662a3df8f7f618b Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Wed, 17 Sep 2025 16:19:19 +0100 Subject: [PATCH 136/148] Docs update --- docs/pkgdown.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 35b3f72f..45989012 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,4 +2,4 @@ pandoc: 3.1.3 pkgdown: 2.1.3 pkgdown_sha: ~ articles: {} -last_built: 2025-08-28T18:48Z +last_built: 2025-09-17T15:04Z From b78506b4a2301adbc6720664bef75e1ff22257ca Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 17 Sep 2025 17:18:09 +0100 Subject: [PATCH 137/148] Update README.md Add missing text for note on numeric precision for Apple Mx architecture --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eed7c5ed..bf9c1ada 100644 --- a/README.md +++ b/README.md @@ -70,12 +70,12 @@ Detailed instructions on how to install DataSHIELD are at https://wiki.datashiel mitigating disclosure risk in a multi-site federated analysis platform.” _Bioinformatics Advances_, *5*(1), 1-21. . -> **_Note:_** Apple Mx architecture users, please be aware that there are some numerical limitations on this platform, which leads to unexpected results when using base R packages, li> -> +> **_Note:_** Apple Mx architecture users, please be aware that there are some numerical limitations on this platform, which leads to unexpected results when using base R packages, like stats​. +> > x <- c(0, 3, 7) > > 1 - cor(x, x)​ > > The above should result in a value of zero. > -> _Also See:_ For more details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f and the bug report: https://bugs.r-project.org/sh> +> _Also See:_ For more details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f and the bug report: https://bugs.r-project.org/show_bug.cgi?id=18941 From 0994f7c0b5c3b3b6dcc1214ade157e69f50737db Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 17 Sep 2025 17:20:22 +0100 Subject: [PATCH 138/148] Update index.html --- docs/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index 22d4d09c..0afa2dfa 100644 --- a/docs/index.html +++ b/docs/index.html @@ -114,11 +114,11 @@

Referenceshttps://doi.org/10.5334/dsj-2017-021.

[4] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1-21. https://doi.org/10.1093/bioadv/vbaf046.

-

Note: Apple Mx architecture users, please be aware that there are some numerical limitations on this platform, which leads to unexpected results when using base R packages, li>

+

Note: Apple Mx architecture users, please be aware that there are some numerical limitations on this platform, which leads to unexpected results when using base R packages, like stats​.

x <- c(0, 3, 7)

1 - cor(x, x)​

The above should result in a value of zero.

-

Also See: For more details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f and the bug report: https://bugs.r-project.org/sh>

+

Also See: For more details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f and the bug report: https://bugs.r-project.org/show_bug.cgi?id=18941

From 17cebc056909e7c715cf7243b8704ac762a45ef8 Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Sat, 20 Sep 2025 18:30:10 +0100 Subject: [PATCH 139/148] Update workflow to avoid relying on external PAT (secrets.GH_TOKEN) and create an artifact with test suite ouputs, instead of pushing to testStatus. Additionally, a new workflow was added to testStatus to 'consume' these artifacts --- .github/workflows/dsBase_test_suite.yaml | 48 ++++++++++-------------- 1 file changed, 20 insertions(+), 28 deletions(-) mode change 100644 => 100755 .github/workflows/dsBase_test_suite.yaml diff --git a/.github/workflows/dsBase_test_suite.yaml b/.github/workflows/dsBase_test_suite.yaml old mode 100644 new mode 100755 index 44020e83..8f03b10f --- a/.github/workflows/dsBase_test_suite.yaml +++ b/.github/workflows/dsBase_test_suite.yaml @@ -37,6 +37,7 @@ jobs: BRANCH_NAME: ${{ github.ref_name }} REPO_OWNER: ${{ github.repository_owner }} R_KEEP_PKG_SOURCE: yes + GITHUB_TOKEN: ${{ github.token || 'placeholder-token' }} steps: - name: Checkout dsBase @@ -45,12 +46,14 @@ jobs: path: dsBase - name: Checkout testStatus + if: ${{ github.actor != 'nektos/act' }} # for local deployment only uses: actions/checkout@v4 with: repository: ${{ env.REPO_OWNER }}/testStatus - token: ${{ secrets.GH_TOKEN }} ref: master path: testStatus + persist-credentials: false + token: ${{ env.GITHUB_TOKEN }} - uses: r-lib/actions/setup-pandoc@v2 @@ -156,44 +159,33 @@ jobs: run: | Rscript --verbose --vanilla ../testStatus/source/parse_test_report.R logs/ working-directory: dsBase - - - name: Commit results to testStatus + + - name: Render report run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" cd testStatus - # Reconfigure remote to use GitHub token for authentication - git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ env.REPO_OWNER }}/testStatus.git - git checkout master - git pull origin master - - mkdir -p logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - mkdir -p docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/ - # clear the latest directory - rm -rf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest/* + 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 - cp -rv ../dsBase/logs/* logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - cp -rv ../dsBase/logs/${{ env.WORKFLOW_ID }}.txt logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../${{ env.PROJECT_NAME }}/logs/* new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ + cp -rv ../${{ env.PROJECT_NAME }}/logs/${{ env.WORKFLOW_ID }}.txt new/logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ - # Create symbolic links - ln -sf ${{ env.WORKFLOW_ID }}/ logs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/.LATEST - # ln -sf docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/ docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/latest - - R -e 'input_dir <- file.path("../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 docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/index.html - cp -r docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/${{ env.WORKFLOW_ID }}/* docs/${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }}/latest - - git add . - git commit -m "Auto test for ${{ env.PROJECT_NAME }}/${{ env.BRANCH_NAME }} @ ${{ env.WORKFLOW_ID }}" || echo "No changes to commit" - git push origin master + 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 env: PROJECT_NAME: ${{ env.PROJECT_NAME }} BRANCH_NAME: ${{ env.BRANCH_NAME }} WORKFLOW_ID: ${{ env.WORKFLOW_ID }} + + - name: Upload test logs + uses: actions/upload-artifact@v4 + with: + name: dsbase-logs + path: testStatus/new - name: Dump environment info run: | From 43398e8452b45322f8762cf2c3e19e826f68a492 Mon Sep 17 00:00:00 2001 From: ESCRI11 Date: Mon, 27 Oct 2025 18:57:32 +0100 Subject: [PATCH 140/148] =?UTF-8?q?feat=C3=91=20mdPatterns=20fct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAMESPACE | 1 + R/mdPatternDS.R | 121 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 R/mdPatternDS.R diff --git a/NAMESPACE b/NAMESPACE index 897148d1..e52e5d10 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -82,6 +82,7 @@ export(matrixDimnamesDS) export(matrixInvertDS) export(matrixMultDS) export(matrixTransposeDS) +export(mdPatternDS) export(meanDS) export(meanSdGpDS) export(mergeDS) diff --git a/R/mdPatternDS.R b/R/mdPatternDS.R new file mode 100644 index 00000000..0f817034 --- /dev/null +++ b/R/mdPatternDS.R @@ -0,0 +1,121 @@ +#' +#' @title Missing data pattern with disclosure control +#' @description 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. +#' @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. +#' +#' \strong{Suppression Method:} +#' +#' When a pattern count is below threshold: +#' - Row name is changed to "suppressed()" 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) +#' +#' \strong{Output Matrix Structure:} +#' +#' - Rows represent different missing data patterns (plus a summary row at the bottom) +#' - Row names contain pattern counts (or "suppressed()" 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 +#' +#' \strong{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. +#' +#' @param x a character string specifying the name of a data frame or matrix +#' containing the data to analyze for missing patterns. +#' @return A list containing: +#' \item{pattern}{The missing data pattern matrix with disclosure control applied} +#' \item{valid}{Logical indicating if all patterns meet disclosure requirements} +#' \item{message}{A message describing the validity status} +#' @author Xavier Escribà montagut for DataSHIELD Development Team +#' @import mice +#' @export +#' +mdPatternDS <- function(x){ + + ############################################################# + # MODULE 1: CAPTURE THE nfilter SETTINGS + thr <- dsBase::listDisclosureSettingsDS() + nfilter.tab <- as.numeric(thr$nfilter.tab) + ############################################################# + + # Parse the input data name with error handling + x.val <- tryCatch( + { + eval(parse(text=x), envir = parent.frame()) + }, + error = function(e) { + stop(paste0("Object '", x, "' does not exist on the server"), call. = FALSE) + } + ) + + # Check object class + typ <- class(x.val) + + # Check that input is a data frame or matrix + if(!("data.frame" %in% typ || "matrix" %in% typ)){ + stop(paste0("The input object must be of type 'data.frame' or 'matrix'. Current type: ", + paste(typ, collapse = ", ")), call. = FALSE) + } + + # Use x.val for further processing + x <- x.val + + # Call mice::md.pattern with plot=FALSE + pattern <- mice::md.pattern(x, plot = FALSE) + + # Apply disclosure control + # Pattern counts are stored in row names (except last row which is empty/summary) + # The last row contains variable-level missing counts + + validity <- "valid" + n_patterns <- nrow(pattern) - 1 # exclude the summary row + + if(n_patterns > 0){ + # Check pattern counts (stored in row names, excluding last row) + pattern_counts <- as.numeric(rownames(pattern)[1:n_patterns]) + + # Find patterns with counts below threshold + invalid_idx <- which(pattern_counts > 0 & pattern_counts < nfilter.tab) + + if(length(invalid_idx) > 0){ + validity <- "invalid" + + # For invalid patterns, suppress by: + # - Setting row name to "suppressed" + # - Setting all pattern values to NA + rnames <- rownames(pattern) + for(idx in invalid_idx){ + rnames[idx] <- paste0("suppressed(<", nfilter.tab, ")") + pattern[idx, ] <- NA + } + rownames(pattern) <- rnames + + # Also need to recalculate the last row (summary) if patterns were suppressed + # Set to NA to avoid disclosures + pattern[nrow(pattern), seq_len(ncol(pattern))] <- NA + } + } + + # Return the pattern with validity information + return(list( + pattern = pattern, + valid = (validity == "valid"), + message = ifelse(validity == "valid", + "Valid: all pattern counts meet disclosure requirements", + paste0("Invalid: some pattern counts below threshold (", + nfilter.tab, ") have been suppressed")) + )) +} + +#AGGREGATE FUNCTION +# mdPatternDS From 987fbcc2f1129a491ce8e9793268a263451a2d8b Mon Sep 17 00:00:00 2001 From: ESCRI11 Date: Mon, 27 Oct 2025 19:00:24 +0100 Subject: [PATCH 141/148] add mdPatterns to DATASHIELD --- inst/DATASHIELD | 1 + 1 file changed, 1 insertion(+) diff --git a/inst/DATASHIELD b/inst/DATASHIELD index c9dd9390..0c59f0c2 100644 --- a/inst/DATASHIELD +++ b/inst/DATASHIELD @@ -37,6 +37,7 @@ AggregateMethods: lmerSLMADS2, lsDS, matrixDetDS1, + mdPatternDS, meanDS, meanSdGpDS, messageDS, From eda4bdc3e075170e2cf6c39f5b6f378585bdd85f Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Mon, 3 Nov 2025 00:14:29 +0000 Subject: [PATCH 142/148] Initial 'mdPatternDS' tests --- man/mdPatternDS.Rd | 54 +++++++++++++++++++++++++++ tests/testthat/test-arg-mdPatternDS.R | 41 ++++++++++++++++++++ tests/testthat/test-smk-mdPatternDS.R | 37 ++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 man/mdPatternDS.Rd create mode 100644 tests/testthat/test-arg-mdPatternDS.R create mode 100644 tests/testthat/test-smk-mdPatternDS.R diff --git a/man/mdPatternDS.Rd b/man/mdPatternDS.Rd new file mode 100644 index 00000000..1084565e --- /dev/null +++ b/man/mdPatternDS.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mdPatternDS.R +\name{mdPatternDS} +\alias{mdPatternDS} +\title{Missing data pattern with disclosure control} +\usage{ +mdPatternDS(x) +} +\arguments{ +\item{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: +\item{pattern}{The missing data pattern matrix with disclosure control applied} +\item{valid}{Logical indicating if all patterns meet disclosure requirements} +\item{message}{A message describing the validity status} +} +\description{ +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. +} +\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. + +\strong{Suppression Method:} + +When a pattern count is below threshold: +- Row name is changed to "suppressed()" 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) + +\strong{Output Matrix Structure:} + +- Rows represent different missing data patterns (plus a summary row at the bottom) +- Row names contain pattern counts (or "suppressed()" 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 + +\strong{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/tests/testthat/test-arg-mdPatternDS.R b/tests/testthat/test-arg-mdPatternDS.R new file mode 100644 index 00000000..f6b4f941 --- /dev/null +++ b/tests/testthat/test-arg-mdPatternDS.R @@ -0,0 +1,41 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2025 ProPASS Consortium. 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("mdPatternDS::arg::setup") + +# +# Tests +# + +context("mdPatternDS::arg::x NULL") +test_that("mdPatternDS x NULL", { + x <- NULL + + expect_error(mdPatternDS(x), "The input object must be of type 'data.frame' or 'matrix'. Current type: NULL") +}) + +context("mdPatternDS::arg::x not valid variable") +test_that("mdPatternDS x not variable", { + x <- "not a variable" + + expect_error(mdPatternDS(x), "Object 'not a variable' does not exist on the server") +}) + +# +# Done +# + +context("mdPatternDS::arg::shutdown") + +context("mdPatternDS::arg::done") diff --git a/tests/testthat/test-smk-mdPatternDS.R b/tests/testthat/test-smk-mdPatternDS.R new file mode 100644 index 00000000..33e65055 --- /dev/null +++ b/tests/testthat/test-smk-mdPatternDS.R @@ -0,0 +1,37 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2025 ProPASS Consortium. 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("mdPatternDS::smk::setup") + +# +# Tests +# + +context("mdPatternDS::smk::sample data.frame") +test_that("mdPatternDS: sample data.frame", { + x_val <- data.frame(v1 = c(0.0, 1.0, 2.0, 3.0, 4.0), v2 = c(4.0, 3.0, 2.0, 1.0, 0.0)) + x <- "x_val" + + res <- mdPatternDS(x) + + expect_length(res, 3) +}) + +# +# Done +# + +context("mdPatternDS::smk::shutdown") + +context("mdPatternDS::smk::done") From e499d8d5873c671c31e7564cb868e1f140fdc42f Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Mon, 3 Nov 2025 13:24:58 +0000 Subject: [PATCH 143/148] Additional mdPattern tests --- tests/testthat/test-smk-mdPatternDS.R | 70 ++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-smk-mdPatternDS.R b/tests/testthat/test-smk-mdPatternDS.R index 33e65055..f00feb84 100644 --- a/tests/testthat/test-smk-mdPatternDS.R +++ b/tests/testthat/test-smk-mdPatternDS.R @@ -18,14 +18,80 @@ context("mdPatternDS::smk::setup") # Tests # -context("mdPatternDS::smk::sample data.frame") -test_that("mdPatternDS: sample data.frame", { +context("mdPatternDS::smk::sample complete data.frame") +test_that("mdPatternDS: sample complete data.frame", { x_val <- data.frame(v1 = c(0.0, 1.0, 2.0, 3.0, 4.0), v2 = c(4.0, 3.0, 2.0, 1.0, 0.0)) x <- "x_val" res <- mdPatternDS(x) expect_length(res, 3) + expect_length(class(res), 1) + expect_true(all(class(res) %in% c("list"))) + expect_length(class(res$pattern), 2) + expect_true(all(class(res$pattern) %in% c("matrix", "array"))) + + expect_length(colnames(res$pattern), 3) + expect_equal(colnames(res$pattern)[1], "v1") + expect_equal(colnames(res$pattern)[2], "v2") + expect_equal(colnames(res$pattern)[3], "") + expect_length(rownames(res$pattern), 2) + expect_equal(rownames(res$pattern)[1], "5") + expect_equal(rownames(res$pattern)[2], "") + + expect_equal(res$pattern[1, 1], 1) + expect_equal(res$pattern[1, 2], 1) + expect_equal(res$pattern[1, 3], 0) + expect_equal(res$pattern[2, 1], 0) + expect_equal(res$pattern[2, 2], 0) + expect_equal(res$pattern[2, 3], 0) + + expect_length(class(res$valid), 1) + expect_true(all(class(res$valid) %in% c("logical"))) + expect_true(res$valid) + expect_length(class(res$message), 1) + expect_true(all(class(res$message) %in% c("character"))) + expect_equal(res$message, "Valid: all pattern counts meet disclosure requirements") +}) + +context("mdPatternDS::smk::sample incomplete data.frame") +test_that("mdPatternDS: sample incomplete data.frame", { + x_val <- data.frame(v1 = c(0.0, NA, 2.0, 3.0, 4.0), v2 = c(4.0, 3.0, 2.0, 1.0, 0.0)) + x <- "x_val" + + res <- mdPatternDS(x) + + expect_length(res, 3) + expect_length(class(res), 1) + expect_true(all(class(res) %in% c("list"))) + expect_length(class(res$pattern), 2) + expect_true(all(class(res$pattern) %in% c("matrix", "array"))) + + expect_length(colnames(res$pattern), 3) + expect_equal(colnames(res$pattern)[1], "v2") + expect_equal(colnames(res$pattern)[2], "v1") + expect_equal(colnames(res$pattern)[3], "") + expect_length(rownames(res$pattern), 3) + expect_equal(rownames(res$pattern)[1], "4") + expect_equal(rownames(res$pattern)[2], "1") + expect_equal(rownames(res$pattern)[3], "") + + expect_equal(res$pattern[1, 1], 1) + expect_equal(res$pattern[1, 2], 1) + expect_equal(res$pattern[1, 3], 0) + expect_equal(res$pattern[2, 1], 1) + expect_equal(res$pattern[2, 2], 0) + expect_equal(res$pattern[2, 3], 1) + expect_equal(res$pattern[3, 1], 0) + expect_equal(res$pattern[3, 2], 1) + expect_equal(res$pattern[3, 3], 1) + + expect_length(class(res$valid), 1) + expect_true(all(class(res$valid) %in% c("logical"))) + expect_true(res$valid) + expect_length(class(res$message), 1) + expect_true(all(class(res$message) %in% c("character"))) + expect_equal(res$message, "Valid: all pattern counts meet disclosure requirements") }) # From 2485816e6cf6a5f7872b935d00411002cd357593 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Mon, 3 Nov 2025 22:51:09 +0000 Subject: [PATCH 144/148] Increased data 'mdPatternDS' tests --- tests/testthat/test-smk-mdPatternDS.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-smk-mdPatternDS.R b/tests/testthat/test-smk-mdPatternDS.R index f00feb84..989fd06b 100644 --- a/tests/testthat/test-smk-mdPatternDS.R +++ b/tests/testthat/test-smk-mdPatternDS.R @@ -56,7 +56,7 @@ test_that("mdPatternDS: sample complete data.frame", { context("mdPatternDS::smk::sample incomplete data.frame") test_that("mdPatternDS: sample incomplete data.frame", { - x_val <- data.frame(v1 = c(0.0, NA, 2.0, 3.0, 4.0), v2 = c(4.0, 3.0, 2.0, 1.0, 0.0)) + x_val <- data.frame(v1 = c(0.0, NA, 2.0, 3.0, 4.0, 5.0, 6.0), v2 = c(6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0)) x <- "x_val" res <- mdPatternDS(x) @@ -72,7 +72,7 @@ test_that("mdPatternDS: sample incomplete data.frame", { expect_equal(colnames(res$pattern)[2], "v1") expect_equal(colnames(res$pattern)[3], "") expect_length(rownames(res$pattern), 3) - expect_equal(rownames(res$pattern)[1], "4") + expect_equal(rownames(res$pattern)[1], "6") expect_equal(rownames(res$pattern)[2], "1") expect_equal(rownames(res$pattern)[3], "") From cf61c2ba33f2087dbf3b135a708ca72494d74251 Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Tue, 4 Nov 2025 12:57:27 +0000 Subject: [PATCH 145/148] Added 'set.standard.disclosure.settings()' --- tests/testthat/test-arg-mdPatternDS.R | 2 ++ tests/testthat/test-smk-mdPatternDS.R | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tests/testthat/test-arg-mdPatternDS.R b/tests/testthat/test-arg-mdPatternDS.R index f6b4f941..bea53d22 100644 --- a/tests/testthat/test-arg-mdPatternDS.R +++ b/tests/testthat/test-arg-mdPatternDS.R @@ -14,6 +14,8 @@ context("mdPatternDS::arg::setup") +set.standard.disclosure.settings() + # # Tests # diff --git a/tests/testthat/test-smk-mdPatternDS.R b/tests/testthat/test-smk-mdPatternDS.R index f00feb84..4c2e4f92 100644 --- a/tests/testthat/test-smk-mdPatternDS.R +++ b/tests/testthat/test-smk-mdPatternDS.R @@ -14,6 +14,8 @@ context("mdPatternDS::smk::setup") +set.standard.disclosure.settings() + # # Tests # From da36ab8bc17caf6c7922c443ac2d75c5d4daf5bc Mon Sep 17 00:00:00 2001 From: Stuart Wheater Date: Tue, 4 Nov 2025 16:23:31 +0000 Subject: [PATCH 146/148] Updated 'mdPatternDS' tests --- tests/testthat/test-disc-mdPatternDS.R | 69 ++++++++++++++++++++++++++ tests/testthat/test-smk-mdPatternDS.R | 30 ++++++----- 2 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 tests/testthat/test-disc-mdPatternDS.R diff --git a/tests/testthat/test-disc-mdPatternDS.R b/tests/testthat/test-disc-mdPatternDS.R new file mode 100644 index 00000000..055974cc --- /dev/null +++ b/tests/testthat/test-disc-mdPatternDS.R @@ -0,0 +1,69 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2025 ProPASS Consortium. 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("mdPatternDS::disc::setup") + +set.standard.disclosure.settings() + +# +# Tests +# + +context("mdPatternDS::disc::sample incomplete data.frame") +test_that("mdPatternDS: sample incomplete data.frame", { + x_val <- data.frame(v1 = c(0.0, NA, 2.0, 3.0, 4.0, 5.0, 6.0), v2 = c(6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0)) + x <- "x_val" + + res <- mdPatternDS(x) + + expect_length(res, 3) + expect_length(class(res), 1) + expect_true(all(class(res) %in% c("list"))) + expect_length(class(res$pattern), 2) + expect_true(all(class(res$pattern) %in% c("matrix", "array"))) + + expect_length(colnames(res$pattern), 3) + expect_equal(colnames(res$pattern)[1], "v2") + expect_equal(colnames(res$pattern)[2], "v1") + expect_equal(colnames(res$pattern)[3], "") + expect_length(rownames(res$pattern), 3) + expect_equal(rownames(res$pattern)[1], "6") + expect_equal(rownames(res$pattern)[2], "suppressed(<3)") + expect_equal(rownames(res$pattern)[3], "") + + expect_equal(res$pattern[1, 1], 1) + expect_equal(res$pattern[1, 2], 1) + expect_equal(res$pattern[1, 3], 0) + expect_true(is.na(res$pattern[2, 1])) + expect_true(is.na(res$pattern[2, 2])) + expect_true(is.na(res$pattern[2, 3])) + expect_true(is.na(res$pattern[3, 1])) + expect_true(is.na(res$pattern[3, 2])) + expect_true(is.na(res$pattern[3, 3])) + + expect_length(class(res$valid), 1) + expect_true(all(class(res$valid) %in% c("logical"))) + expect_false(res$valid) + expect_length(class(res$message), 1) + expect_true(all(class(res$message) %in% c("character"))) + expect_equal(res$message, "Invalid: some pattern counts below threshold (3) have been suppressed") +}) + +# +# Done +# + +context("mdPatternDS::disc::shutdown") + +context("mdPatternDS::disc::done") diff --git a/tests/testthat/test-smk-mdPatternDS.R b/tests/testthat/test-smk-mdPatternDS.R index 96c43772..6cbe0062 100644 --- a/tests/testthat/test-smk-mdPatternDS.R +++ b/tests/testthat/test-smk-mdPatternDS.R @@ -20,8 +20,8 @@ set.standard.disclosure.settings() # Tests # -context("mdPatternDS::smk::sample complete data.frame") -test_that("mdPatternDS: sample complete data.frame", { +context("mdPatternDS::smk::sample 1 complete data.frame") +test_that("mdPatternDS: sample 1 complete data.frame", { x_val <- data.frame(v1 = c(0.0, 1.0, 2.0, 3.0, 4.0), v2 = c(4.0, 3.0, 2.0, 1.0, 0.0)) x <- "x_val" @@ -56,9 +56,10 @@ test_that("mdPatternDS: sample complete data.frame", { expect_equal(res$message, "Valid: all pattern counts meet disclosure requirements") }) -context("mdPatternDS::smk::sample incomplete data.frame") -test_that("mdPatternDS: sample incomplete data.frame", { - x_val <- data.frame(v1 = c(0.0, NA, 2.0, 3.0, 4.0, 5.0, 6.0), v2 = c(6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0)) + +context("mdPatternDS::smk::sample 2 complete data.frame") +test_that("mdPatternDS: sample 2 complete data.frame", { + x_val <- data.frame(v1 = c(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0), v2 = c(9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0)) x <- "x_val" res <- mdPatternDS(x) @@ -70,23 +71,20 @@ test_that("mdPatternDS: sample incomplete data.frame", { expect_true(all(class(res$pattern) %in% c("matrix", "array"))) expect_length(colnames(res$pattern), 3) - expect_equal(colnames(res$pattern)[1], "v2") - expect_equal(colnames(res$pattern)[2], "v1") + expect_equal(colnames(res$pattern)[1], "v1") + expect_equal(colnames(res$pattern)[2], "v2") expect_equal(colnames(res$pattern)[3], "") - expect_length(rownames(res$pattern), 3) - expect_equal(rownames(res$pattern)[1], "6") - expect_equal(rownames(res$pattern)[2], "1") - expect_equal(rownames(res$pattern)[3], "") + expect_length(rownames(res$pattern), 2) + expect_equal(rownames(res$pattern)[1], "10") + expect_equal(rownames(res$pattern)[2], "") + expect_true(is.na(rownames(res$pattern)[3])) expect_equal(res$pattern[1, 1], 1) expect_equal(res$pattern[1, 2], 1) expect_equal(res$pattern[1, 3], 0) - expect_equal(res$pattern[2, 1], 1) + expect_equal(res$pattern[2, 1], 0) expect_equal(res$pattern[2, 2], 0) - expect_equal(res$pattern[2, 3], 1) - expect_equal(res$pattern[3, 1], 0) - expect_equal(res$pattern[3, 2], 1) - expect_equal(res$pattern[3, 3], 1) + expect_equal(res$pattern[2, 3], 0) expect_length(class(res$valid), 1) expect_true(all(class(res$valid) %in% c("logical"))) From 81f5f64c69a99ef88f7e5bf25a3ca92f9e5a536d Mon Sep 17 00:00:00 2001 From: Roberto Villegas-Diaz Date: Wed, 26 Nov 2025 18:40:32 +0000 Subject: [PATCH 147/148] 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 148/148] 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 }}