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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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