From 1b45c3fabffabecb716e58f0085830935b6ef595 Mon Sep 17 00:00:00 2001 From: Andreas Gammelgaard Damsbo Date: Sat, 10 May 2025 11:30:36 +0200 Subject: [PATCH] polished redcap import and code export --- R/redcap_read_shiny_module.R | 59 ++++++++++++++++++++++++++++-------- man/simple_snake.Rd | 20 ++++++++++++ 2 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 man/simple_snake.Rd diff --git a/R/redcap_read_shiny_module.R b/R/redcap_read_shiny_module.R index 8857e5f..9499e7d 100644 --- a/R/redcap_read_shiny_module.R +++ b/R/redcap_read_shiny_module.R @@ -200,9 +200,12 @@ m_redcap_readServer <- function(id) { ) # browser() - shiny::withProgress({ - imported <- try(rlang::exec(REDCapR::redcap_metadata_read, !!!parameters), silent = TRUE) - },message = paste("Connecting to",data_rv$uri)) + shiny::withProgress( + { + imported <- try(rlang::exec(REDCapR::redcap_metadata_read, !!!parameters), silent = TRUE) + }, + message = paste("Connecting to", data_rv$uri) + ) ## TODO: Simplify error messages if (inherits(imported, "try-error") || NROW(imported) < 1 || ifelse(is.list(imported), !isTRUE(imported$success), FALSE)) { @@ -228,7 +231,7 @@ m_redcap_readServer <- function(id) { status = "success", include_data_alert( see_data_text = "Click to see data dictionary", - dataIdName = "see_data", + dataIdName = "see_dd", extra = tags$p( tags$b(phosphoricons::ph("check", weight = "bold"), "Connected to server!"), glue::glue("The {data_rv$info$project_title} project is loaded.") @@ -254,8 +257,8 @@ m_redcap_readServer <- function(id) { output$connect_success <- shiny::reactive(identical(data_rv$dd_status, "success")) shiny::outputOptions(output, "connect_success", suspendWhenHidden = FALSE) - shiny::observeEvent(input$see_data, { - datamods::show_data( + shiny::observeEvent(input$see_dd, { + show_data( purrr::pluck(data_rv$dd_list, "data"), title = "Data dictionary", type = "modal", @@ -264,6 +267,17 @@ m_redcap_readServer <- function(id) { ) }) + shiny::observeEvent(input$see_data, { + show_data( + # purrr::pluck(data_rv$dd_list, "data"), + data_rv$data, + title = "Imported data set", + type = "modal", + show_classes = FALSE, + tags$b("Preview:") + ) + }) + arms <- shiny::reactive({ shiny::req(input$api) shiny::req(data_rv$uri) @@ -378,13 +392,24 @@ m_redcap_readServer <- function(id) { imported <- try(rlang::exec(REDCapCAST::read_redcap_tables, !!!parameters), silent = TRUE) }) - code <- rlang::call2("read_redcap_tables", - !!!utils::modifyList(parameters, list(token = "PERSONAL_API_TOKEN")), , + parameters_code <- parameters[c("uri", "fields", "events", "raw_or_label", "filter_logic")] + + code <- rlang::call2( + "easy_redcap", + !!!utils::modifyList( + parameters_code, + list( + data_format = ifelse( + input$data_type == "long" && !is.null(input$data_type), + "long", + "wide" + ), + project.name = simple_snake(data_rv$info$project_title) + ) + ), .ns = "REDCapCAST" ) - # browser() - if (inherits(imported, "try-error") || NROW(imported) < 1) { data_rv$data_status <- "error" data_rv$data_list <- NULL @@ -453,9 +478,17 @@ m_redcap_readServer <- function(id) { datamods:::insert_alert( selector = ns("retrieved"), status = data_rv$data_status, - tags$p( - tags$b(phosphoricons::ph("check", weight = "bold"), "Success!"), - data_rv$data_message + # tags$p( + # tags$b(phosphoricons::ph("check", weight = "bold"), "Success!"), + # data_rv$data_message + # ), + include_data_alert( + see_data_text = "Click to see the imported data", + dataIdName = "see_data", + extra = tags$p( + tags$b(phosphoricons::ph("check", weight = "bold"), data_rv$data_message) + ), + btn_show_data = TRUE ) ) } else { diff --git a/man/simple_snake.Rd b/man/simple_snake.Rd new file mode 100644 index 0000000..f79ba9a --- /dev/null +++ b/man/simple_snake.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helpers.R +\name{simple_snake} +\alias{simple_snake} +\title{Simplified version of the snakecase packages to_snake_case} +\usage{ +simple_snake(data) +} +\arguments{ +\item{data}{character string vector} +} +\value{ +vector +} +\description{ +Simplified version of the snakecase packages to_snake_case +} +\examples{ +c("foo bar", "fooBar21", "!!Foo'B'a-r", "foo_bar", "F OO bar") |> simple_snake() +}