Compare commits

..

No commits in common. "b3434d9dfb05a77607e6daf49d9d02a0af858b17" and "a5e26354deed6c8b0eae60ec32b3bab3e5298a90" have entirely different histories.

9 changed files with 34 additions and 83 deletions

View file

@ -2,8 +2,6 @@
Polished and simplified data import module including a much improved REDCap import module.
- *CHANGE* `default_parsing()` now ensure unique variable names.
# FreesearchR 25.4.1
Focus is on polish and improved ui/ux.

View file

@ -1 +1 @@
app_version <- function()'Version: 25.4.1.250408_1343'
app_version <- function()'Version: 25.4.1.250403_1506'

View file

@ -71,11 +71,7 @@ add_sparkline <- function(grid, column = "vals", color.main = "#2a8484", color.s
column = column,
renderer = function(data) {
data_cl <- class(data)
if (all(sapply(data,is.na))){
type <- "line"
ds <- data.frame(x = NA, y = NA)
horizontal <- FALSE
} else if (identical(data_cl, "factor")) {
if (identical(data_cl, "factor")) {
type <- "column"
s <- summary(data)
ds <- data.frame(x = names(s), y = s)

View file

@ -213,7 +213,6 @@ default_parsing <- function(data) {
name_labels <- lapply(data, \(.x) REDCapCAST::get_attr(.x, attr = "label"))
out <- data |>
setNames(make.names(names(data),unique = TRUE)) |>
REDCapCAST::parse_data() |>
REDCapCAST::as_factor() |>
REDCapCAST::numchar2fct(numeric.threshold = 8, character.throshold = 10) |>

View file

@ -218,8 +218,8 @@ import_file_server <- function(id,
shinyWidgets::updatePickerInput(
session = session,
inputId = "sheet",
selected = selected,
choices = choices
choices = choices,
selected = selected
)
datamods:::showUI(paste0("#", ns("sheet-container")))
} else {
@ -291,32 +291,17 @@ import_file_server <- function(id,
)
observeEvent(input$see_data, {
tryCatch({
datamods:::show_data(default_parsing(temporary_rv$data), title = datamods:::i18n("Imported data"), type = show_data_in)
},
# warning = function(warn) {
# showNotification(warn, type = "warning")
# },
error = function(err) {
showNotification(err, type = "err")
}
)
datamods:::show_data(temporary_rv$data, title = datamods:::i18n("Imported data"), type = show_data_in)
})
output$table <- toastui::renderDatagrid2({
req(temporary_rv$data)
tryCatch({
toastui::datagrid(
data = setNames(head(temporary_rv$data, 5),make.names(names(temporary_rv$data))),
data = head(temporary_rv$data, 5),
theme = "striped",
colwidths = "guess",
minBodyHeight = 250
)
},
error = function(err) {
showNotification(err, type = "err")
}
)
})
observeEvent(input$confirm, {
@ -419,9 +404,9 @@ import_xls <- function(file, sheet, skip, na.strings) {
}) |>
purrr::reduce(dplyr::full_join)
},
# warning = function(warn) {
# showNotification(paste0(warn), type = "warning")
# },
warning = function(warn) {
showNotification(paste0(warn), type = "warning")
},
error = function(err) {
showNotification(paste0(err), type = "err")
}
@ -448,9 +433,9 @@ import_ods <- function(file, sheet, skip, na.strings) {
}) |>
purrr::reduce(dplyr::full_join)
},
# warning = function(warn) {
# showNotification(paste0(warn), type = "warning")
# },
warning = function(warn) {
showNotification(paste0(warn), type = "warning")
},
error = function(err) {
showNotification(paste0(err), type = "err")
}

View file

@ -321,7 +321,7 @@ m_redcap_readServer <- function(id) {
"Yes, fill missing, non-repeated values" = "yes",
"No, leave the data as is" = "no"
),
selected = "no",
selected = "yes",
multiple = FALSE
)
}

View file

@ -10,7 +10,7 @@
#### Current file: /Users/au301842/FreesearchR/R//app_version.R
########
app_version <- function()'Version: 25.4.1.250408_1343'
app_version <- function()'Version: 25.4.1.250403_1506'
########
@ -2102,11 +2102,7 @@ add_sparkline <- function(grid, column = "vals", color.main = "#2a8484", color.s
column = column,
renderer = function(data) {
data_cl <- class(data)
if (all(sapply(data,is.na))){
type <- "line"
ds <- data.frame(x = NA, y = NA)
horizontal <- FALSE
} else if (identical(data_cl, "factor")) {
if (identical(data_cl, "factor")) {
type <- "column"
s <- summary(data)
ds <- data.frame(x = names(s), y = s)
@ -2690,7 +2686,6 @@ default_parsing <- function(data) {
name_labels <- lapply(data, \(.x) REDCapCAST::get_attr(.x, attr = "label"))
out <- data |>
setNames(make.names(names(data),unique = TRUE)) |>
REDCapCAST::parse_data() |>
REDCapCAST::as_factor() |>
REDCapCAST::numchar2fct(numeric.threshold = 8, character.throshold = 10) |>
@ -3096,8 +3091,8 @@ import_file_server <- function(id,
shinyWidgets::updatePickerInput(
session = session,
inputId = "sheet",
selected = selected,
choices = choices
choices = choices,
selected = selected
)
datamods:::showUI(paste0("#", ns("sheet-container")))
} else {
@ -3169,32 +3164,17 @@ import_file_server <- function(id,
)
observeEvent(input$see_data, {
tryCatch({
datamods:::show_data(default_parsing(temporary_rv$data), title = datamods:::i18n("Imported data"), type = show_data_in)
},
# warning = function(warn) {
# showNotification(warn, type = "warning")
# },
error = function(err) {
showNotification(err, type = "err")
}
)
datamods:::show_data(temporary_rv$data, title = datamods:::i18n("Imported data"), type = show_data_in)
})
output$table <- toastui::renderDatagrid2({
req(temporary_rv$data)
tryCatch({
toastui::datagrid(
data = setNames(head(temporary_rv$data, 5),make.names(names(temporary_rv$data))),
data = head(temporary_rv$data, 5),
theme = "striped",
colwidths = "guess",
minBodyHeight = 250
)
},
error = function(err) {
showNotification(err, type = "err")
}
)
})
observeEvent(input$confirm, {
@ -3297,9 +3277,9 @@ import_xls <- function(file, sheet, skip, na.strings) {
}) |>
purrr::reduce(dplyr::full_join)
},
# warning = function(warn) {
# showNotification(paste0(warn), type = "warning")
# },
warning = function(warn) {
showNotification(paste0(warn), type = "warning")
},
error = function(err) {
showNotification(paste0(err), type = "err")
}
@ -3326,9 +3306,9 @@ import_ods <- function(file, sheet, skip, na.strings) {
}) |>
purrr::reduce(dplyr::full_join)
},
# warning = function(warn) {
# showNotification(paste0(warn), type = "warning")
# },
warning = function(warn) {
showNotification(paste0(warn), type = "warning")
},
error = function(err) {
showNotification(paste0(err), type = "err")
}
@ -4525,7 +4505,7 @@ m_redcap_readServer <- function(id) {
"Yes, fill missing, non-repeated values" = "yes",
"No, leave the data as is" = "no"
),
selected = "no",
selected = "yes",
multiple = FALSE
)
}

View file

@ -5,6 +5,6 @@ account: agdamsbo
server: shinyapps.io
hostUrl: https://api.shinyapps.io/v1
appId: 13611288
bundleId: 10077795
bundleId: 10049531
url: https://agdamsbo.shinyapps.io/freesearcheR/
version: 1

View file

@ -35,7 +35,7 @@ As a small note, a standalone Windows app version is on the drawing board as wel
## Importing data
Once in the app and in the "**Import**", you have three options available for importing data: file upload, REDCap server export and local or sample data.
Once in the app and in the "*Import*", you have three options available for importing data: file upload, REDCap server export and local or sample data.
After choosing a data source, you can set a threshold to filter data be completenes and further manually specify variables to include for analyses.
@ -43,31 +43,20 @@ After choosing a data source, you can set a threshold to filter data be complete
Currently several data file formats are supported for easy import (csv, txt, xls(x), ods, rds, dta). If importing workbooks (xls(x) or ods), you are prompted to specify sheet(s) to import. If choosing multiple sheets, these are automatically merged by common variable(s), so please make sure that key variables are correctly named identically.
A notification is posted with error or success. After succesfull import data can be previewed directly by clicking "click to see data" in the notification.
### REDCap server export
Export data directly from a REDCap server. You need to first generate an API-token ([see these instruction](https://confluence.research.cchmc.org/pages/viewpage.action?pageId=50987698)) in REDCap. Make sure you have the necessary rights to do so.
Please don't store the API-key on your device unless encrypted or in a keyring, as this may compromise data safety. Log in to your REDCap server and retrieve the token when needed.
Type the correct webaddress of your REDCap server.
The module will validate the information and you can click "Connect".
This will unfold options to preview your data dictionary (the main database metadata), choose fields/variables to download as well as filtering options.
### Local or sample data
## Evaluate
### Baseline
### Correlation matrix
## Visuals
There are a number of plotting options to visualise different aspects of the data.
## Visualise
Below are the available plot types listed.
@ -89,12 +78,16 @@ c("continuous", "dichotomous", "ordinal", "categorical") |>
toastui::datagrid(filters=TRUE,theme="striped")
```
## Regression
## Download
### Report
### Data
### Code