Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
95d36e9
chore: bootstrap batch-5 from batch-4
timcadman Apr 15, 2026
d1cf587
refactor: batch-5 matrix client functions
timcadman Apr 15, 2026
1f23991
chore: update dsBase tar with batch-5
timcadman Apr 15, 2026
196a343
test: add performance tests for batch 5 functions
timcadman Apr 16, 2026
5dff8ad
fix: remove third-party copyright from new tests
timcadman Apr 16, 2026
6a632e5
fix: correct perf test setup for batch 5 matrix functions
timcadman Apr 16, 2026
df8ab68
docs: sync REFACTOR_GUIDE.md from batch-9
timcadman Apr 16, 2026
f0d64f6
docs: sync REFACTOR_GUIDE.md from batch-10
timcadman Apr 16, 2026
1b42aa0
docs: sync REFACTOR_GUIDE.md
timcadman Apr 19, 2026
0de07a7
Fix: Armadillo 'hp-laptop-quay' Perf Profile
StuartWheater Jun 17, 2026
6fcda4b
Fix formatting issues in performance profile CSV
StuartWheater Jun 18, 2026
7a3562a
Update performance metrics in armadillo CSV file
StuartWheater Jun 19, 2026
fcbdd9e
Fixed 'armadillo hp-laptop-quay' perf profile
StuartWheater Jun 19, 2026
bc1e6cc
Merge branch 'datashield:v7.0-dev' into v7.0-dev
StuartWheater Jul 14, 2026
b2c00a5
Merge branch 'datashield:v7.0-dev' into v7.0-dev
StuartWheater Jul 16, 2026
d37d2ea
Update docs and man
StuartWheater Jul 20, 2026
a6658e0
Setting 'useFancyQuotes' option to 'FALSE'
StuartWheater Jul 22, 2026
8fea89e
merged in 7.0 dev
timcadman Jul 23, 2026
2b2a481
ci: install R deps as Posit binary packages
timcadman Jul 23, 2026
49820fd
Profile image change and performance update
StuartWheater Jul 26, 2026
b4e55df
try: force CI
timcadman Jul 27, 2026
2f19c68
Update 'docker-compose' analysis images
StuartWheater Jul 27, 2026
fa13e63
Merge branch 'datashield:v7.0-dev' into v7.0-dev
StuartWheater Jul 27, 2026
8ddbfa0
Update profile image
StuartWheater Jul 29, 2026
b7515b1
Update Roxygen and NAMESPACE
StuartWheater Aug 10, 2026
581c9a2
Change profile image to 'datashield/rock_citest-permissive:latest'
StuartWheater Aug 17, 2026
36cf744
Update to roxygen2 8.1.0
StuartWheater Aug 18, 2026
7a06aa4
Updated perf profile
StuartWheater Aug 20, 2026
a3d2c4a
try: update dsBase tar
timcadman Aug 25, 2026
239f81e
Merge pull request #678 from datashield/ci/speedup-dependency-install
timcadman Aug 27, 2026
cd02e06
Merge branch 'datashield:v7.0-dev' into v7.0-dev
StuartWheater Aug 27, 2026
3f8720b
Merge pull request #691 from datashield/refactor/perf-batch-5
timcadman Aug 27, 2026
bac1712
Merge branch 'v7.0-dev' into v7.0-dev
StuartWheater Aug 27, 2026
a11c3ac
Merge branch 'v7.0-dev_perf-profile-update' into v7.0-dev
StuartWheater Aug 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Authors@R: c(person(given = "Paul",
affiliation = "Genomics Coordination Centre, UMCG, Netherlands")))
License: GPL-3
Depends:
R (>= 4.0.0),
R (>= 4.1.0),
DSI (>= 1.7.1)
Imports:
cli,
Expand All @@ -88,6 +88,6 @@ Suggests:
DSOpal,
DSMolgenisArmadillo,
DSLite
RoxygenNote: 8.0.0
Encoding: UTF-8
Language: en-GB
Config/roxygen2/version: 8.1.0
10 changes: 6 additions & 4 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ import(DSI)
import(data.table)
importFrom(DSI,datashield.connections_find)
importFrom(cli,cli_abort)
importFrom(stats,as.formula)
importFrom(stats,na.omit)
importFrom(stats,ts)
importFrom(stats,weighted.mean)
importFrom(stats,
as.formula,
na.omit,
ts,
weighted.mean
)
96 changes: 3 additions & 93 deletions R/ds.matrix.R
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,9 @@
#' @param datasources a list of \code{\link[DSI]{DSConnection-class}}
#' objects obtained after login. If the \code{datasources} argument is not specified
#' the default set of connections will be used: see \code{\link[DSI]{datashield.connections_default}}.
#' @return \code{ds.matrix} returns the created matrix which is written on the server-side.
#' In addition, two validity messages are returned
#' indicating whether the new matrix has been created in each data source and if so whether
#' it is in a valid form.
#' @return \code{ds.matrix} returns the created matrix which is written on the server-side.
#' @author DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @examples
#' \dontrun{
#'
Expand Down Expand Up @@ -147,15 +145,7 @@
ds.matrix <- function(mdata = NA, from="clientside.scalar", nrows.scalar=NULL, ncols.scalar=NULL, byrow = FALSE,
dimnames = NULL, newobj=NULL, datasources=NULL){

# look for DS connections
if(is.null(datasources)){
datasources <- datashield.connections_find()
}

# ensure datasources is a list of DSConnection-class
if(!(is.list(datasources) && all(unlist(lapply(datasources, function(d) {methods::is(d,"DSConnection")}))))){
stop("The 'datasources' were expected to be a list of DSConnection-class objects", call.=FALSE)
}
datasources <- .set_datasources(datasources)

# check if a value has been provided for mdata
if(is.null(mdata)){
Expand Down Expand Up @@ -208,85 +198,5 @@ ds.matrix <- function(mdata = NA, from="clientside.scalar", nrows.scalar=NULL, n



#############################################################################################################
#DataSHIELD CLIENTSIDE MODULE: CHECK KEY DATA OBJECTS SUCCESSFULLY CREATED #
#
#SET APPROPRIATE PARAMETERS FOR THIS PARTICULAR FUNCTION #
test.obj.name<-newobj #
#
#TRACER #
#return(test.obj.name) #
#} #
#
#
# CALL SEVERSIDE FUNCTION #
calltext <- call("testObjExistsDS", test.obj.name) #
#
object.info<-DSI::datashield.aggregate(datasources, calltext) #
#
# CHECK IN EACH SOURCE WHETHER OBJECT NAME EXISTS #
# AND WHETHER OBJECT PHYSICALLY EXISTS WITH A NON-NULL CLASS #
num.datasources<-length(object.info) #
#
#
obj.name.exists.in.all.sources<-TRUE #
obj.non.null.in.all.sources<-TRUE #
#
for(j in 1:num.datasources){ #
if(!object.info[[j]]$test.obj.exists){ #
obj.name.exists.in.all.sources<-FALSE #
} #
if(is.null(object.info[[j]]$test.obj.class) || ("ABSENT" %in% object.info[[j]]$test.obj.class)){ #
obj.non.null.in.all.sources<-FALSE #
} #
} #
#
if(obj.name.exists.in.all.sources && obj.non.null.in.all.sources){ #
#
return.message<- #
paste0("A data object <", test.obj.name, "> has been created in all specified data sources") #
#
#
}else{ #
#
return.message.1<- #
paste0("Error: A valid data object <", test.obj.name, "> does NOT exist in ALL specified data sources") #
#
return.message.2<- #
paste0("It is either ABSENT and/or has no valid content/class,see return.info above") #
#
return.message.3<- #
paste0("Please use ds.ls() to identify where missing") #
#
#
return.message<-list(return.message.1,return.message.2,return.message.3) #
#
} #
#
calltext <- call("messageDS", test.obj.name) #
studyside.message<-DSI::datashield.aggregate(datasources, calltext) #
#
no.errors<-TRUE #
for(nd in 1:num.datasources){ #
if(studyside.message[[nd]]!="ALL OK: there are no studysideMessage(s) on this datasource"){ #
no.errors<-FALSE #
} #
} #
#
#
if(no.errors){ #
validity.check<-paste0("<",test.obj.name, "> appears valid in all sources") #
return(list(is.object.created=return.message,validity.check=validity.check)) #
} #
#
if(!no.errors){ #
validity.check<-paste0("<",test.obj.name,"> invalid in at least one source. See studyside.messages:") #
return(list(is.object.created=return.message,validity.check=validity.check, #
studyside.messages=studyside.message)) #
} #
#
#END OF CHECK OBJECT CREATED CORECTLY MODULE #
#############################################################################################################

}
#ds.matrix
101 changes: 4 additions & 97 deletions R/ds.matrixDet.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,10 @@
#' @param datasources a list of \code{\link[DSI]{DSConnection-class}}
#' objects obtained after login. If the \code{datasources} argument is not specified
#' the default set of connections will be used: see \code{\link[DSI]{datashield.connections_default}}.
#' @return \code{ds.matrixDet} returns the determinant of an existing matrix on the server-side.
#' The created new object is stored on the server-side.
#' Also, two validity messages are returned
#' indicating whether the matrix has been created in each data source and if so whether
#' it is in a valid form.
#' @return \code{ds.matrixDet} returns the determinant of an existing matrix on the server-side.
#' The created new object is stored on the server-side.
#' @author DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @examples
#' \dontrun{
#'
Expand Down Expand Up @@ -83,23 +81,12 @@
#'
ds.matrixDet<-function(M1=NULL, newobj=NULL, logarithm=FALSE, datasources=NULL){

# look for DS connections
if(is.null(datasources)){
datasources <- datashield.connections_find()
}

# ensure datasources is a list of DSConnection-class
if(!(is.list(datasources) && all(unlist(lapply(datasources, function(d) {methods::is(d,"DSConnection")}))))){
stop("The 'datasources' were expected to be a list of DSConnection-class objects", call.=FALSE)
}
datasources <- .set_datasources(datasources)

# check if user has provided the name of matrix representing M1
if(is.null(M1)){
return("Error: Please provide the name of the matrix representing M1")
}

# check if the input object is defined in all the studies
isDefined(datasources, M1)

# if no value or invalid value specified for logarithm, then specify a default
if(is.null(logarithm)){
Expand All @@ -119,85 +106,5 @@ ds.matrixDet<-function(M1=NULL, newobj=NULL, logarithm=FALSE, datasources=NULL){
calltext <- call("matrixDetDS2", M1, logarithm)
DSI::datashield.assign(datasources, newobj, calltext)

#############################################################################################################
#DataSHIELD CLIENTSIDE MODULE: CHECK KEY DATA OBJECTS SUCCESSFULLY CREATED #
#
#SET APPROPRIATE PARAMETERS FOR THIS PARTICULAR FUNCTION #
test.obj.name<-newobj #
#
#TRACER #
#return(test.obj.name) #
#} #
#
#
# CALL SEVERSIDE FUNCTION #
calltext <- call("testObjExistsDS", test.obj.name) #
#
object.info<-DSI::datashield.aggregate(datasources, calltext) #
#
# CHECK IN EACH SOURCE WHETHER OBJECT NAME EXISTS #
# AND WHETHER OBJECT PHYSICALLY EXISTS WITH A NON-NULL CLASS #
num.datasources<-length(object.info) #
#
#
obj.name.exists.in.all.sources<-TRUE #
obj.non.null.in.all.sources<-TRUE #
#
for(j in 1:num.datasources){ #
if(!object.info[[j]]$test.obj.exists){ #
obj.name.exists.in.all.sources<-FALSE #
} #
if(is.null(object.info[[j]]$test.obj.class) || ("ABSENT" %in% object.info[[j]]$test.obj.class)){ #
obj.non.null.in.all.sources<-FALSE #
} #
} #
#
if(obj.name.exists.in.all.sources && obj.non.null.in.all.sources){ #
#
return.message<- #
paste0("A data object <", test.obj.name, "> has been created in all specified data sources") #
#
#
}else{ #
#
return.message.1<- #
paste0("Error: A valid data object <", test.obj.name, "> does NOT exist in ALL specified data sources") #
#
return.message.2<- #
paste0("It is either ABSENT and/or has no valid content/class,see return.info above") #
#
return.message.3<- #
paste0("Please use ds.ls() to identify where missing") #
#
#
return.message<-list(return.message.1,return.message.2,return.message.3) #
#
} #
#
calltext <- call("messageDS", test.obj.name) #
studyside.message<-DSI::datashield.aggregate(datasources, calltext) #
#
no.errors<-TRUE #
for(nd in 1:num.datasources){ #
if(studyside.message[[nd]]!="ALL OK: there are no studysideMessage(s) on this datasource"){ #
no.errors<-FALSE #
} #
} #
#
#
if(no.errors){ #
validity.check<-paste0("<",test.obj.name, "> appears valid in all sources") #
return(list(is.object.created=return.message,validity.check=validity.check)) #
} #
#
if(!no.errors){ #
validity.check<-paste0("<",test.obj.name,"> invalid in at least one source. See studyside.messages:") #
return(list(is.object.created=return.message,validity.check=validity.check, #
studyside.messages=studyside.message)) #
} #
#
#END OF CHECK OBJECT CREATED CORRECTLY MODULE #
#############################################################################################################

}
#ds.matrixDet
11 changes: 2 additions & 9 deletions R/ds.matrixDet.report.R
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#' @return \code{ds.matrixDet.report} returns to the client-side
#' the determinant of a matrix that is stored on the server-side.
#' @author DataSHIELD Development Team
#' @author Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands
#' @examples
#' \dontrun{
#'
Expand Down Expand Up @@ -76,15 +77,7 @@
#'
ds.matrixDet.report<-function(M1=NULL, logarithm=FALSE, datasources=NULL){

# look for DS connections
if(is.null(datasources)){
datasources <- datashield.connections_find()
}

# ensure datasources is a list of DSConnection-class
if(!(is.list(datasources) && all(unlist(lapply(datasources, function(d) {methods::is(d,"DSConnection")}))))){
stop("The 'datasources' were expected to be a list of DSConnection-class objects", call.=FALSE)
}
datasources <- .set_datasources(datasources)

# check if user has provided the name of matrix representing M1
if(is.null(M1)){
Expand Down
Loading
Loading