Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
2fac542
update version
jwildfire Mar 4, 2019
5c618c0
change module naming convention
Mar 4, 2019
d1044bc
disable css to test
Mar 4, 2019
6c52490
create chart tabs from server side
Mar 4, 2019
affac0b
Merge pull request #207 from ASA-DIA-InteractiveSafetyGraphics/dev-v0…
Mar 4, 2019
2bc8344
Update generateSettings.R
jwildfire Mar 8, 2019
4c21892
started generateSettings refactor
pburnsdata Mar 8, 2019
74795e4
update defaults to use tibble
pburnsdata Mar 11, 2019
be556aa
fix defaults.rda save and load
pburnsdata Mar 11, 2019
d105658
start generateShell.R
pburnsdata Mar 11, 2019
6ed2a37
recording thoughts
pburnsdata Mar 11, 2019
61153e6
refactor generate shell
jwildfire Mar 13, 2019
aee1603
a bit more refactor
jwildfire Mar 13, 2019
c7878dc
remove stray print()s
jwildfire Mar 13, 2019
4f61b50
more generateSettings refactor
jwildfire Mar 14, 2019
c6b00ca
remove compare cols
jwildfire Mar 14, 2019
c9b7fee
update docs. start fixing tests
jwildfire Mar 14, 2019
2660ce1
fix bug with 0-row merge
jwildfire Mar 15, 2019
88c7399
update generateSettings tests
jwildfire Mar 15, 2019
bac9b18
update checks to support NA and NULL settings
jwildfire Mar 15, 2019
ddbbbb7
update trim_data
jwildfire Mar 15, 2019
a7e4f09
add simple generateShell tests
jwildfire Mar 18, 2019
a987377
clear checks
jwildfire Mar 18, 2019
a1803bd
Merge pull request #208 from SafetyGraphics/generate-settings-mockup
Mar 18, 2019
00af723
use NULL instead of NA in shell
jwildfire Mar 18, 2019
29a1635
Merge pull request #212 from SafetyGraphics/na-to-null
Mar 18, 2019
0752b7f
merge v0.9.1 from master
jwildfire Mar 19, 2019
3382a5f
Merge pull request #214 from SafetyGraphics/dev-v0.10.0
Mar 19, 2019
0f8a0ca
create safetyHistogram widget
Mar 21, 2019
1c5591a
update metadata per safetyHistogram addition
Mar 21, 2019
4abffcb
helper function to get subset of chart-specific settings
Mar 21, 2019
f793c95
handle case where chart has no field settings
Mar 21, 2019
6d23c69
update module per chart addition
Mar 21, 2019
f6d92a1
safety histogram chart module
Mar 21, 2019
b458b71
temporarily remove condition due to bug
Mar 21, 2019
ed24047
dynamic chart UI
Mar 21, 2019
4616901
source module
Mar 21, 2019
9b1d478
tweaks
Mar 21, 2019
b8d5cee
set unit_col default to NULL
Mar 21, 2019
9480b06
set unit_col default to NULL
Mar 21, 2019
247eeb4
generalize to multiple charts
Mar 22, 2019
493dfe5
comments - other option that doesn't want to work in the loop..
Mar 22, 2019
ba6cae3
"eDISH" -> "Histogram"
Mar 26, 2019
94e318e
add start_value
Mar 26, 2019
09b16a1
remove commments
Mar 26, 2019
4ea34ba
alphabetize value options
Mar 26, 2019
bbd9419
make sure numeric keys exist before performing checks
Mar 26, 2019
351df94
make sure numeric keys exist before numeric checks
Mar 26, 2019
040ac6f
add start_value
Mar 26, 2019
be14f81
comment re: bug
Mar 26, 2019
151a767
comment out checks for validity b/c not working correctly
Mar 26, 2019
9077cd6
add comment
Mar 26, 2019
d4a67b5
docs for safetyHistogram chart module
Mar 26, 2019
9866c5e
comment
Mar 27, 2019
2e76197
add chart_safetyhistogram to data doc
Mar 27, 2019
c26ca23
remove status from Settings nav bar
Mar 27, 2019
b9894b1
Merge pull request #216 from SafetyGraphics/multichart_UI
Mar 27, 2019
291dde2
correcting some of the testthat tests
pburnsdata Mar 28, 2019
3bd6d85
first buggy pass at automating settings generation
jwildfire Mar 29, 2019
1d99316
append + hide/show tabs within navbarmenu
Apr 9, 2019
df0a660
remove stray brace
jwildfire Apr 10, 2019
5c3d67e
code formatting/comments
jwildfire Apr 10, 2019
4424923
Merge pull request #226 from SafetyGraphics/redo-tabs
Apr 10, 2019
e3e5a81
Merge branch 'dev-v0.10.0' into automate-settings-generation
jwildfire Apr 10, 2019
ddfdad7
clean indent
jwildfire Apr 10, 2019
40eea36
more formatting
jwildfire Apr 10, 2019
aaf3f35
fixing settings merge ...
jwildfire Apr 10, 2019
7143a27
more settings mapping tweaks
jwildfire Apr 11, 2019
303b2b0
move code that coerces "" settings to NULL's
Apr 12, 2019
28d4a88
convert dataDefault to tibble; tweak final setting value
Apr 12, 2019
571dfc9
loop thru chart modules
Apr 12, 2019
b32bebd
deal with empty string
jwildfire Apr 12, 2019
302b564
Merge pull request #228 from SafetyGraphics/becca_fixes
Apr 12, 2019
f205f9f
Merge pull request #224 from SafetyGraphics/automate-settings-generation
Apr 12, 2019
cb7eb96
fix input_names() reactive. fix #229
jwildfire Apr 12, 2019
2b65e3b
re-add deleted req()
jwildfire Apr 12, 2019
bdc2392
fix #232
pburnsdata Apr 15, 2019
9e6e98b
clean up
pburnsdata Apr 15, 2019
e05d3cb
handle case where no charts are select, fix #235
Apr 17, 2019
0a99e47
Merge pull request #236 from SafetyGraphics/handle-no-charts
pburnsdata Apr 17, 2019
485a75b
Merge pull request #234 from SafetyGraphics/persist-settings
pburnsdata Apr 17, 2019
90cb6b3
css updates
jwildfire Apr 18, 2019
1c2a3d6
refactor chart control. fix #233
jwildfire Apr 18, 2019
35cda99
hardcode callModules
Apr 19, 2019
9814b7b
Change export chart label
Apr 19, 2019
faa0725
remove comment
Apr 19, 2019
6d82694
add rowwise
Apr 19, 2019
26733b7
add css for valid/invalid
Apr 19, 2019
f1fc4b0
insert span on chart tabs for class toggling
Apr 22, 2019
64b87ce
figured out the selector
Apr 22, 2019
19139b6
more specific selector
Apr 22, 2019
daed223
Merge pull request #246 from SafetyGraphics/add-tab-ids
Apr 22, 2019
cd34eaa
Merge pull request #241 from SafetyGraphics/add-chart-validation-css
Apr 22, 2019
a83c4e4
merge dev branch
jwildfire Apr 22, 2019
05e35f8
Merge pull request #243 from SafetyGraphics/chart-select-tweaks
Apr 22, 2019
462638f
merge dev branch
jwildfire Apr 22, 2019
bdd75bb
Merge pull request #244 from SafetyGraphics/becca_fixes_dev0.10
Apr 22, 2019
f043d22
fix stray merge issue
jwildfire Apr 22, 2019
c2e79f4
allow null in hasField/Column checks. fix #240
jwildfire Apr 22, 2019
65a32c6
reference status_df() outside of for loop
Apr 22, 2019
91520ae
Merge pull request #249 from SafetyGraphics/fix-validation-statuses
Apr 22, 2019
12faa02
Merge branch 'dev-v0.10.0' into tweak-hasField
jwildfire Apr 22, 2019
7263537
Merge pull request #248 from SafetyGraphics/tweak-hasField
Apr 22, 2019
d68b706
remove non-ASCII string
Apr 22, 2019
ec121ac
tweak tests
Apr 22, 2019
71f6370
update safetyHistogram to v2.2.3
pburnsdata Apr 22, 2019
9dd254d
update eDish to v0.16.5
pburnsdata Apr 22, 2019
a0dc821
Merge pull request #250 from SafetyGraphics/address-checks
Apr 22, 2019
d0b6098
handle vectors in trimData
pburnsdata Apr 22, 2019
3a9ed5d
fix getSettingValue instead
pburnsdata Apr 23, 2019
3f46a62
and get rid of old fix
pburnsdata Apr 23, 2019
3e5386a
remove stray else if
pburnsdata Apr 23, 2019
d264bed
update eDish js
pburnsdata Apr 23, 2019
3fe8222
update webcharts js
pburnsdata Apr 23, 2019
9275773
update getSettingValue and add tests
jwildfire Apr 23, 2019
627395b
Merge branch 'fix-filters' of github.com:ASA-DIA-InteractiveSafetyGra…
jwildfire Apr 23, 2019
f5f8746
Merge branch 'dev-v0.10.0' into fix-filters
jwildfire Apr 23, 2019
7c1b0e4
fix array getSettingValue bug
pburnsdata Apr 23, 2019
29b83a7
change getSettingValue if to is.numeric
pburnsdata Apr 23, 2019
bccc26c
Merge pull request #251 from SafetyGraphics/fix-filters
Apr 23, 2019
34e52a1
remove export button if no edish selected
Apr 23, 2019
253a77f
Merge pull request #254 from SafetyGraphics/handle-deselect-edish
Apr 24, 2019
a11aed3
show marks in white when chart is selected
jwildfire Apr 24, 2019
a630d41
force chart input to update upon App startup
Apr 24, 2019
f998f39
Merge pull request #258 from SafetyGraphics/force-chart-update
Apr 24, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Package: safetyGraphics
Title: Create Interactive Graphics Related to Clinical Trial Safety
Version: 0.9.1
Version: 0.10.0
Authors@R: c(
person("Jeremy", "Wildfire", email = "jeremy_wildfire@rhoworld.com", role = c("cre","aut")),
person("Becca", "Krouse", role="aut"),
Expand Down
4 changes: 4 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ export(generateSettings)
export(getRequiredSettings)
export(getSettingsMetadata)
export(renderEDISH)
export(renderSafetyHistogram)
export(safetyGraphicsApp)
export(safetyHistogram)
export(safetyHistogramOutput)
export(validateSettings)
import(DT)
import(dplyr)
Expand All @@ -16,6 +19,7 @@ import(rmarkdown)
import(shinyjs)
importFrom(dplyr,"filter")
importFrom(dplyr,filter)
importFrom(dplyr,full_join)
importFrom(haven,read_sas)
importFrom(magrittr,"%>%")
importFrom(purrr,keep)
Expand Down
18 changes: 9 additions & 9 deletions R/checkColumn.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,27 @@
#' testSettings$filters[[1]]<-list(value_col="RACE",label="Race")
#' testSettings$filters[[2]]<-list(value_col=NULL,label="No Column")
#' testSettings$filters[[3]]<-list(value_col="NotAColumn",label="Invalid Column")
#'
#'
#' #pass ($valid == TRUE)
#' safetyGraphics:::checkColumn(key=list("id_col"),
#' settings=testSettings, adlbc)
#'
#' settings=testSettings, adlbc)
#'
#' #pass
#' safetyGraphics:::checkColumn(key=list("filters",1,"value_col"),
#' settings=testSettings, adlbc)
#'
#' settings=testSettings, adlbc)
#'
#' #NULL column pass
#' safetyGraphics:::checkColumn(key=list("filters",2,"value_col"),
#' settings=testSettings, adlbc)
#'
#' settings=testSettings, adlbc)
#'
#' #invalid column fails
#' safetyGraphics:::checkColumn(key=list("filters",3,"value_col"),
#' settings=testSettings, adlbc)
#' settings=testSettings, adlbc)
#' @keywords internal

checkColumn <- function(key, settings, data){
stopifnot(typeof(key)=="list",typeof(settings)=="list")

current <- list(key=key)
current$text_key <- paste( unlist(current$key), collapse='--')
current$type <- "column"
Expand Down
8 changes: 4 additions & 4 deletions R/checkNumeric.R
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
#' @examples
#' testSettings<-generateSettings(standard="AdAM")
#' #pass ($valid == FALSE)
#' safetyGraphics:::checkNumeric(key=list("id_col"),settings=testSettings, data=adlbc)
#'
#' safetyGraphics:::checkNumeric(key=list("id_col"),settings=testSettings, data=adlbc)
#'
#' #pass ($valid == TRUE)
#' safetyGraphics:::checkNumeric(key=list("value_col"),settings=testSettings, data=adlbc)
#'
#' safetyGraphics:::checkNumeric(key=list("value_col"),settings=testSettings, data=adlbc)
#'
#' @keywords internal

checkNumeric <- function(key, settings, data){
Expand Down
1 change: 1 addition & 0 deletions R/data_checks.R
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#Statistical Checks
178 changes: 106 additions & 72 deletions R/generateSettings.R
Original file line number Diff line number Diff line change
@@ -1,104 +1,138 @@
#' Generate a settings object based on a data standard
#'
#' This function returns a settings object for the eDish chart based on the specified data standard.
#' This function returns a settings object for the eDish chart based on the specified data standard.
#'
#' The function is designed to work with the SDTM and AdAM CDISC(<https://www.cdisc.org/>) standards for clinical trial data. Currently, eDish is the only chart supported.
#'
#' @param standard The data standard for which to create settings. Valid options are "SDTM", "AdAM" or "None". Default: \code{"SDTM"}
#' @param chart The chart for which standards should be generated ("eDish" only for now) . Default: \code{"eDish"}.
#' @param standard The data standard for which to create settings. Valid options are "SDTM", "AdAM" or "None". Default: \code{"None"}.
#' @param charts The chart or chart(s) for which settings should be generated. Default: \code{NULL} (uses all available charts).
#' @param useDefaults Specifies whether default values from settingsMetadata should be included in the settings object. Default: \code{TRUE}.
#' @param partial Boolean for whether or not the standard is a partial standard. Default: \code{FALSE}.
#' @param partial_keys Optional character vector of the matched settings if partial is TRUE. Settings should be identified using the text_key format described in ?settingsMetadata. Setting is ignored when partial is FALSE. Default: \code{NULL}.
#' @param custom_settings a tibble with text_key and customValue columns specifiying customizations to be applied to the settings object. Default: \code{NULL}.
#' @return A list containing the appropriate settings for the selected chart
#'
#' @examples
#'
#' generateSettings(standard="SDTM")
#'
#' @examples
#'
#' generateSettings(standard="SDTM")
#' generateSettings(standard="SdTm") #also ok
#' generateSettings(standard="ADaM")
#' pkeys<- c("id_col","measure_col","value_col")
#' generateSettings(standard="adam", partial=TRUE, partial_keys=pkeys)
#'
#' generateSettings(standard="a different standard")
#'
#' generateSettings(standard="a different standard")
#' #returns shell settings list with no data mapping
#'
#'
#' \dontrun{
#' generateSettings(standard="adam",chart="AEExplorer") #Throws error. Only eDish supported so far.
#' generateSettings(standard="adam",chart="AEExplorer") #Throws error. Only eDish supported so far.
#' }
#'
#' @importFrom dplyr "filter"
#'
#' @importFrom dplyr "filter" full_join
#' @importFrom stringr str_split
#' @importFrom rlang .data
#'
#'
#' @export

generateSettings <- function(standard="None", chart="eDish", partial=FALSE, partial_keys=NULL){
if(tolower(chart)!="edish"){
stop(paste0("Can't generate settings for the specified chart ('",chart,"'). Only the 'eDish' chart is supported for now."))
}

generateSettings <- function(standard="None", charts=NULL, useDefaults=TRUE, partial=FALSE, partial_keys=NULL, custom_settings=NULL){

# Check that partial_keys is supplied if partial is true
if (is.null(partial_keys) & partial ) {
stop("partial_keys must be supplied if the standard is partial")
}

# Coerce options to lowercase
standard<-tolower(standard)
chart<-tolower(chart)

if(!is.null(charts)){
charts<-tolower(charts)
}

#############################################################################
# get keys & default values for settings using a data standard (data and field mappings)
############################################################################
# Build a table of data mappings for the selected standard and partial settings
standardList<-c("adam","sdtm") #TODO: automatically generate this from metadata
standardList<-safetyGraphics::standardsMetadata%>%select(-.data$text_key)%>%names

if(standard %in% standardList){
dataMappings <- safetyGraphics::getSettingsMetadata(
charts = chart,
dataDefaults <- safetyGraphics::getSettingsMetadata(
charts = charts,
cols=c("text_key",standard,"setting_required")
) %>%
) %>%
filter(.data$setting_required)%>%
rename("column_name" = standard)%>%
filter(.data$column_name != '')

if(partial){
dataMappings<-dataMappings%>%filter(.data$text_key %in% partial_keys)
}
select(-.data$setting_required)%>%
rename("dataDefault" = standard)%>%
filter(.data$dataDefault != '') %>%
as_tibble
}else{
dataDefaults<-tibble(text_key=character(),dataDefault=character(), .rows=0)
}

# build shell settings for each chart
# TODO: move these to `/data` eventually
shells<-list()
shells[["edish"]]<-list(
id_col = NULL,
value_col = NULL,
measure_col = NULL,
normal_col_low = NULL,
normal_col_high = NULL,
studyday_col=NULL,
visit_col = NULL,
visitn_col = NULL,
filters = NULL,
group_cols = NULL,
measure_values = list(ALT = NULL,
AST = NULL,
TB = NULL,
ALP = NULL),
baseline = list(value_col=NULL,
values=list()),
analysisFlag = list(value_col=NULL,
values=list()),

x_options = c("ALT", "AST", "ALP"),
y_options = c("TB", "ALP"),
visit_window = 30,
r_ratio_filter = TRUE,
r_ratio_cut = 0,
showTitle = TRUE,
warningText = "Caution: This interactive graphic is not validated. Any clinical recommendations based on this tool should be confirmed using your organizations standard operating procedures."
)

# loop through dataMappings and apply them to the shell
if(standard %in% standardList){
for(row in 1:nrow(dataMappings)){
shells[[chart]]<-setSettingsValue(settings = shells[[chart]], key = textKeysToList(dataMappings[row,"text_key"])[[1]], value = dataMappings[row, "column_name"])
}

if(partial){
dataDefaults <-dataDefaults%>%filter(.data$text_key %in% partial_keys)
}
#############################################################################
# get keys & default values for settings not using a data standard
#############################################################################
if(useDefaults){
otherDefaults <- safetyGraphics::getSettingsMetadata(
charts = charts,
filter = !.data$column_mapping & !.data$field_mapping,
cols=c("text_key","default")
)%>%
rename("otherDefault"="default")
}else{
otherDefaults <- tibble(text_key=character(),otherDefault=character(), .rows=0)
}

#############################################################################
# merge all keys & default values
#############################################################################
key_values <- full_join(dataDefaults, otherDefaults, by="text_key")
key_values <- key_values %>% mutate(default=ifelse(is.na(.data$dataDefault),.data$otherDefault,.data$dataDefault))

#############################################################################
# Apply custom settings (if any)
#############################################################################
if(!is.null(custom_settings)){
key_values<-full_join(key_values, custom_settings, by="text_key")
} else {
key_values$customValue<-NA
}

key_values<- key_values %>% mutate(value=ifelse(is.na(.data$customValue),.data$default,.data$customValue))

#############################################################################
# create shell settings object
#############################################################################
shell<-generateShell(charts=charts)

#########################################################################################
# populate the shell settings by looping through key_values and apply them to the shell
#########################################################################################
#print(key_values)
for(row in 1:nrow(key_values)){
text_key<-key_values[row,]%>%pull("text_key")
key<- textKeysToList(text_key)[[1]]
type <- safetyGraphics::getSettingsMetadata(text_keys=text_key,cols="setting_type")
value <- key_values[row,"value"][[1]]
finalValue <- value[[1]]

#print(paste(text_key," (",type,"):",toString(value),typeof(value),length(value),"->",finalValue,typeof(finalValue),length(finalValue)))
shell<-setSettingsValue(
settings = shell,
key = key,
value = finalValue
)
}

#Coerce empty string to NULL
for (i in names(shell)){
if (!is.null(shell[[i]])){
if (shell[[i]][1]==""){
shell[i] <- list(NULL)
}
}
}

return(shells[[chart]])
}
#print(shell)
return(shell)
}
34 changes: 34 additions & 0 deletions R/generateShell.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#' Generate a default settings shell based on settings metadata
#'
#' This function returns a default settings object based on the chart(s) specified.
#'
#' The function is designed to work with valid safetyGraphics charts.
#'
#' @param charts The chart or chart(s) to include in the shell settings object
#' @return A list containing a setting shell (all values = NA) for the selected chart(s)
#'
#' @examples
#'
#' safetyGraphics:::generateShell(charts = "eDish")
#'
#' @keywords internal

generateShell <- function(charts=NULL){
keys <- safetyGraphics::getSettingsMetadata(
charts = charts,
cols=c("text_key")
) %>% textKeysToList()

shell <- list()

for (i in 1:length(keys) ) {
shell<-setSettingsValue(
key=keys[[i]],
value=NULL,
settings=shell,
forceCreate=TRUE
)
}

return(shell)
}
19 changes: 19 additions & 0 deletions R/getChartSettings.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#' Get chart-specific settings
#'
#' Subset master settings list to chart-specific settings list only
#'
#' @param settings Settings list containing settings for all selected charts.
#' @param chart The chart for which settings should be returned.
#'
#' @return Chart-specific settings
#'
#' @examples
#' settings <- safetyGraphics::generateSettings(standard="ADaM")
#' safetyGraphics:::getChartSettings(settings = settings, chart = "edish")
#'
#' @keywords internal
#'
getChartSettings <- function(settings, chart){
settings_names <- names(safetyGraphics::generateSettings("None",chart=chart))
return(settings[settings_names])
}
3 changes: 3 additions & 0 deletions R/getSettingValue.R
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ getSettingValue <- function(key,settings){
#If there are more keys and the value is a list, iterate
if(typeof(value)=="list"){
value<-getSettingValue(key[2:length(key)],value)
#If position is provided and the value is a vector
}else if(is.numeric(key[[2]]) & length(value)>=key[[2]] & length(key)==2){
value<-value[[key[[2]]]]
}else{
#If there are more keys, but the value is not a list, return NULL
value<-NULL
Expand Down
Loading