mirror of
https://github.com/agdamsbo/REDCapCAST.git
synced 2024-11-23 21:50:21 +01:00
Compare commits
8 Commits
e26efd01b4
...
6abee8f78e
Author | SHA1 | Date | |
---|---|---|---|
6abee8f78e | |||
70f7ab188b | |||
2697206272 | |||
9378da535e | |||
bf9cf328cc | |||
4a56f4ec45 | |||
|
b35142f0cc | ||
|
104220d10d |
@ -6,7 +6,7 @@ options(
|
||||
)
|
||||
|
||||
|
||||
source("renv/activate.R")
|
||||
# source("renv/activate.R")
|
||||
|
||||
if (interactive()) {
|
||||
suppressMessages(require(usethis))
|
||||
|
14
.github/FUNDING.yml
vendored
Normal file
14
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: agdamsbo
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: agdamsbo
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
2
.github/workflows/R-CMD-check.yaml
vendored
2
.github/workflows/R-CMD-check.yaml
vendored
@ -39,7 +39,7 @@ jobs:
|
||||
http-user-agent: ${{ matrix.config.http-user-agent }}
|
||||
use-public-rspm: true
|
||||
|
||||
- uses: r-lib/actions/setup-renv@v2
|
||||
# - uses: r-lib/actions/setup-renv@v2
|
||||
|
||||
- uses: r-lib/actions/setup-r-dependencies@v2
|
||||
with:
|
||||
|
2
.github/workflows/pkgdown.yaml
vendored
2
.github/workflows/pkgdown.yaml
vendored
@ -30,7 +30,7 @@ jobs:
|
||||
with:
|
||||
use-public-rspm: true
|
||||
|
||||
- uses: r-lib/actions/setup-renv@v2
|
||||
# - uses: r-lib/actions/setup-renv@v2
|
||||
|
||||
- uses: r-lib/actions/setup-r-dependencies@v2
|
||||
with:
|
||||
|
2
.github/workflows/test-coverage.yaml
vendored
2
.github/workflows/test-coverage.yaml
vendored
@ -21,7 +21,7 @@ jobs:
|
||||
with:
|
||||
use-public-rspm: true
|
||||
|
||||
- uses: r-lib/actions/setup-renv@v2
|
||||
# - uses: r-lib/actions/setup-renv@v2
|
||||
|
||||
- uses: r-lib/actions/setup-r-dependencies@v2
|
||||
with:
|
||||
|
@ -1,6 +1,6 @@
|
||||
Package: REDCapCAST
|
||||
Title: REDCap Castellated Data Handling
|
||||
Version: 24.5.1
|
||||
Version: 24.6.1
|
||||
Authors@R: c(
|
||||
person("Andreas Gammelgaard", "Damsbo", email = "agdamsbo@clin.au.dk",
|
||||
role = c("aut", "cre"),comment = c(ORCID = "0000-0002-7559-1154")),
|
||||
|
5
NEWS.md
5
NEWS.md
@ -1,4 +1,4 @@
|
||||
# REDCapCAST 24.5.1
|
||||
# REDCapCAST 24.6.1
|
||||
|
||||
### Functions
|
||||
|
||||
@ -13,8 +13,7 @@
|
||||
|
||||
### Documentation and more
|
||||
|
||||
* Dependencies: In order to deploy `shiny_cast()` with `shinylive`, I need to remove `curl` as a dependency. To accomplish this, the `shiny_deploy()` helper functions has been moved to the package [`pacakge.aid`](https://github.com/agdamsbo/package.aid). This was before realising that `REDCapR` has `curl` as dependency, which is the culprit. `REDCapCAST` is not going to be a `shinylive` web-app without removing `REDCapR` dependency, which in the app is used for easy data upload and data dictionary deployment.
|
||||
|
||||
* Dependencies: In order to deploy `shiny_cast()` with `shinylive`, I need to remove `curl` as a dependency. To accomplish this, the `shiny_deploy()` helper functions has been moved to the package [`pacakge.aid`](https://github.com/agdamsbo/package.aid). This was before realising that `REDCapR` has `curl` as dependency, which is the culprit. `REDCapCAST` is not going to be a `shinylive` web-app without removing `REDCapR` dependency or any other REDCap database interaction, which would defy the purpose. I'll stick to hosted Shiny app instead.
|
||||
|
||||
# REDCapCAST 24.2.1
|
||||
|
||||
|
25
R/doc2dd.R
25
R/doc2dd.R
@ -108,6 +108,9 @@ doc2dd <- function(data,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
## Defining the calculations
|
||||
if (is_missing(col.calculation)) {
|
||||
out <- out |>
|
||||
@ -115,12 +118,13 @@ doc2dd <- function(data,
|
||||
calculations = missing.default
|
||||
)
|
||||
} else {
|
||||
# With inspiration from textclean package, curly apostrophe is replaced
|
||||
out <- out |>
|
||||
dplyr::mutate(
|
||||
calculations = dplyr::pick(col.calculation) |>
|
||||
unlist() |>
|
||||
tolower() |>
|
||||
(\(.x) gsub("’", "'", .x))()
|
||||
replace_curly_quote()
|
||||
)
|
||||
}
|
||||
|
||||
@ -288,3 +292,22 @@ is_missing <- function(data,nas=c("", "NA")) {
|
||||
is.na(data) | data %in% nas
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#' Replace curly apostrophes and quotes from word
|
||||
#'
|
||||
#' @description
|
||||
#' Copied from textclean, which has not been updated since 2018 and is not
|
||||
#' on CRAN. Github:https://github.com/trinker/textclean
|
||||
#'
|
||||
#' @param x character vector
|
||||
#'
|
||||
#' @return character vector
|
||||
replace_curly_quote <- function(x){
|
||||
replaces <- c('\x91', '\x92', '\x93', '\x94')
|
||||
Encoding(replaces) <- "latin1"
|
||||
for (i in 1:4) {
|
||||
x <- gsub(replaces[i], c("'", "'", "\"", "\"")[i], x, fixed = TRUE)
|
||||
}
|
||||
x
|
||||
}
|
||||
|
@ -343,10 +343,10 @@ ds2dd_detailed <- function(data,
|
||||
lapply(function(x) {
|
||||
if (is.factor(x)) {
|
||||
## Re-factors to avoid confusion with missing levels
|
||||
## Assumes alle relevant levels are represented in the data
|
||||
## Assumes all relevant levels are represented in the data
|
||||
re_fac <- factor(x)
|
||||
paste(
|
||||
paste(unique(as.numeric(re_fac)),
|
||||
paste(seq_along(levels(re_fac)),
|
||||
levels(re_fac),
|
||||
sep = ", "
|
||||
),
|
||||
|
@ -2,6 +2,7 @@
|
||||
[![GitHub R package version](https://img.shields.io/github/r-package/v/agdamsbo/REDCapCAST)](https://github.com/agdamsbo/REDCapCAST)
|
||||
[![CRAN/METACRAN](https://img.shields.io/cran/v/REDCapCAST)](https://CRAN.R-project.org/package=REDCapCAST)
|
||||
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8013984.svg)](https://doi.org/10.5281/zenodo.8013984)
|
||||
[![R-hub](https://github.com/agdamsbo/REDCapCAST/actions/workflows/rhub.yaml/badge.svg)](https://github.com/agdamsbo/REDCapCAST/actions/workflows/rhub.yaml)
|
||||
[![R-CMD-check](https://github.com/agdamsbo/REDCapCAST/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/agdamsbo/REDCapCAST/actions/workflows/R-CMD-check.yaml)
|
||||
[![Page deployed](https://github.com/agdamsbo/REDCapCAST/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/agdamsbo/REDCapCAST/actions/workflows/pages/pages-build-deployment)
|
||||
[![Codecov test coverage](https://codecov.io/gh/agdamsbo/REDCapCAST/branch/master/graph/badge.svg)](https://app.codecov.io/gh/agdamsbo/REDCapCAST?branch=master)
|
||||
@ -34,7 +35,9 @@ Here is just a short description of the main functions:
|
||||
|
||||
* `ds2dd_detailed()`: Converts a data set to a data dictionary for upload to a new REDCap database. Variables (fields) and instruments in a REDCap data base are defined by this data dictionary.
|
||||
|
||||
* `shiny_cast()`: [Shiny](https://www.rstudio.com/products/shiny/) application to ease the process of converting a spreadsheet/data set to a REDCap database. The app runs locally and data is transferred securely. You can just create and upload the data dictionary, but you can also transfer the given data in the same process. The app is [hosted on shinyapps.io](https://agdamsbo.shinyapps.io/redcapcast/) while I work on a [shinylive](https://posit-dev.github.io/r-shinylive/) implementation.
|
||||
* `doc2dd()`: Converts a document table to data dictionary. This allows to specify instrument or whole data dictionary in text document, which for most is easier to work with and easily modifiable. Very much like a easy version of just working directly in the data dictionary file itself.
|
||||
|
||||
* `shiny_cast()`: [Shiny](https://www.rstudio.com/products/shiny/) application to ease the process of converting a spreadsheet/data set to a REDCap database. The app runs locally and data is transferred securely. You can just create and upload the data dictionary, but you can also transfer the given data in the same process. The app is [hosted on shinyapps.io](https://agdamsbo.shinyapps.io/redcapcast/) ~~while I work on a [shinylive](https://posit-dev.github.io/r-shinylive/) implementation~~.
|
||||
|
||||
## Future
|
||||
|
||||
@ -51,7 +54,7 @@ install.packages("REDCapCAST")
|
||||
Install the latest version directly from GitHub:
|
||||
|
||||
```
|
||||
remotes::install_github("agdamsbo/REDCapCAST")
|
||||
pak::pak("agdamsbo/REDCapCAST")
|
||||
```
|
||||
|
||||
## Code of Conduct
|
||||
|
@ -1,10 +0,0 @@
|
||||
name: redcapcast
|
||||
title:
|
||||
username: agdamsbo
|
||||
account: agdamsbo
|
||||
server: shinyapps.io
|
||||
hostUrl: https://api.shinyapps.io/v1
|
||||
appId: 11351429
|
||||
bundleId:
|
||||
url: https://agdamsbo.shinyapps.io/redcapcast/
|
||||
version: 1
|
@ -1,10 +0,0 @@
|
||||
name: shiny_cast
|
||||
title:
|
||||
username: cognitiveindex
|
||||
account: cognitiveindex
|
||||
server: shinyapps.io
|
||||
hostUrl: https://api.shinyapps.io/v1
|
||||
appId: 11351378
|
||||
bundleId: 8306502
|
||||
url: https://cognitiveindex.shinyapps.io/shiny_cast/
|
||||
version: 1
|
51
app/ui.R
51
app/ui.R
@ -1,6 +1,6 @@
|
||||
ui <- shiny::shinyUI(
|
||||
shiny::fluidPage(
|
||||
theme = shinythemes::shinytheme("united"),
|
||||
theme = shinythemes::shinytheme("flatly"),
|
||||
|
||||
## -----------------------------------------------------------------------------
|
||||
## Application title
|
||||
@ -11,15 +11,20 @@ ui <- shiny::shinyUI(
|
||||
# windowTitle = "REDCap database creator"
|
||||
# ),
|
||||
|
||||
shiny::titlePanel(title = shiny::div(shiny::a(shiny::img(src="logo.png"),href="https://agdamsbo.github.io/REDCapCAST"),
|
||||
"Easy REDCap database creation"),
|
||||
shiny::titlePanel(
|
||||
title = shiny::div(
|
||||
shiny::a(shiny::img(src = "logo.png"), href = "https://agdamsbo.github.io/REDCapCAST"),
|
||||
"Easy REDCap database creation"
|
||||
),
|
||||
windowTitle = "REDCap database creator"
|
||||
),
|
||||
shiny::h4("This tool includes to convenient functions:",
|
||||
shiny::br(),
|
||||
"1) creating a REDCap data dictionary based on a spreadsheet (.csv/.xls(x)/.dta) and",
|
||||
shiny::br(),
|
||||
"2) creating said database on a given REDCap server and uploading the dataset via API access."),
|
||||
shiny::h4(
|
||||
"This tool includes to convenient functions:",
|
||||
shiny::br(),
|
||||
"1) creating a REDCap data dictionary based on a spreadsheet (.csv/.xls(x)/.dta/.ods) and",
|
||||
shiny::br(),
|
||||
"2) creating said database on a given REDCap server and uploading the dataset via API access."
|
||||
),
|
||||
|
||||
|
||||
## -----------------------------------------------------------------------------
|
||||
@ -34,7 +39,8 @@ ui <- shiny::shinyUI(
|
||||
".csv",
|
||||
".xls",
|
||||
".xlsx",
|
||||
".dta"
|
||||
".dta",
|
||||
".ods"
|
||||
)
|
||||
),
|
||||
shiny::h6("Below you can download the dataset formatted for upload and the
|
||||
@ -60,7 +66,7 @@ ui <- shiny::shinyUI(
|
||||
label = "API key",
|
||||
value = ""
|
||||
),
|
||||
shiny::h6("An API key is an access key to the REDCap database. Please", shiny::a("see here for directions", href="https://www.iths.org/news/redcap-tip/redcap-api-101/"), " to obtain an API key for your project."),
|
||||
shiny::h6("An API key is an access key to the REDCap database. Please", shiny::a("see here for directions", href = "https://www.iths.org/news/redcap-tip/redcap-api-101/"), " to obtain an API key for your project."),
|
||||
shiny::actionButton(
|
||||
inputId = "upload.meta",
|
||||
label = "Upload datadictionary", icon = shiny::icon("book-bookmark")
|
||||
@ -110,17 +116,17 @@ ui <- shiny::shinyUI(
|
||||
shiny::br(),
|
||||
shiny::hr(),
|
||||
shiny::tags$footer(shiny::strong("Disclaimer: "),
|
||||
"This tool is aimed at demonstrating use of REDCapCAST. No responsibility for data loss or any other problems will be taken. Please contact me for support.",
|
||||
shiny::br(),
|
||||
shiny::a("License: GPL-3+",href="https://agdamsbo.github.io/REDCapCAST/LICENSE.html"),
|
||||
"|",
|
||||
shiny::a("agdamsbo/REDCapCAST",href="https://agdamsbo.github.io/REDCapCAST"),
|
||||
"|",
|
||||
shiny::a("Source",href="https://github.com/agdamsbo/REDCapCAST"),
|
||||
"|",
|
||||
shiny::a("Contact",href="https://andreas.gdamsbo.dk"),
|
||||
align = "center",
|
||||
style = "
|
||||
"This tool is aimed at demonstrating use of REDCapCAST. The app can be run locally or on a hosted server (will save no data anywhere). No responsibility for data loss or any other problems will be taken. Please contact me for support.",
|
||||
shiny::br(),
|
||||
shiny::a("License: GPL-3+", href = "https://agdamsbo.github.io/REDCapCAST/LICENSE.html"),
|
||||
"|",
|
||||
shiny::a("agdamsbo/REDCapCAST", href = "https://agdamsbo.github.io/REDCapCAST"),
|
||||
"|",
|
||||
shiny::a("Source", href = "https://github.com/agdamsbo/REDCapCAST"),
|
||||
"|",
|
||||
shiny::a("Contact", href = "https://andreas.gdamsbo.dk"),
|
||||
align = "center",
|
||||
style = "
|
||||
position:fixed;
|
||||
bottom:40px;
|
||||
width:100%;
|
||||
@ -129,6 +135,7 @@ ui <- shiny::shinyUI(
|
||||
padding: 0px;
|
||||
background-color: White;
|
||||
z-index: 100;
|
||||
")
|
||||
"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -1,20 +1,2 @@
|
||||
## Test environments
|
||||
- R-hub windows-x86_64-devel (r-devel)
|
||||
- R-hub ubuntu-gcc-release (r-release)
|
||||
- R-hub fedora-clang-devel (r-devel)
|
||||
|
||||
## R CMD check results
|
||||
❯ On windows-x86_64-devel (r-devel)
|
||||
checking for non-standard things in the check directory ... NOTE
|
||||
Found the following files/directories:
|
||||
''NULL''
|
||||
|
||||
❯ On windows-x86_64-devel (r-devel)
|
||||
checking for detritus in the temp directory ... NOTE
|
||||
'lastMiKTeXException'
|
||||
|
||||
❯ On ubuntu-gcc-release (r-release), fedora-clang-devel (r-devel)
|
||||
checking HTML version of manual ... NOTE
|
||||
Skipping checking HTML validation: no command 'tidy' found
|
||||
|
||||
0 errors ✔ | 0 warnings ✔ | 3 notes ✖
|
||||
New Rhubv2 implemented and tested with GitHub actions. All passed.
|
||||
|
@ -4,6 +4,7 @@ Codecov
|
||||
DOI
|
||||
DataDictionary
|
||||
GStat
|
||||
Github
|
||||
GithubActions
|
||||
JSON
|
||||
Lifecycle
|
||||
@ -14,7 +15,6 @@ README
|
||||
REDCap
|
||||
REDCapR
|
||||
REDCapRITS
|
||||
THe
|
||||
UI
|
||||
WD
|
||||
al
|
||||
@ -34,8 +34,10 @@ dplyr
|
||||
ds
|
||||
dta
|
||||
et
|
||||
github
|
||||
gues
|
||||
hms
|
||||
https
|
||||
immprovements
|
||||
io
|
||||
jbi
|
||||
@ -55,6 +57,7 @@ perl
|
||||
pos
|
||||
pre
|
||||
readr
|
||||
realising
|
||||
sel
|
||||
sep
|
||||
seperator
|
||||
@ -64,9 +67,11 @@ stRoke
|
||||
stata
|
||||
strsplit
|
||||
subheader
|
||||
textclean
|
||||
thorugh
|
||||
tibble
|
||||
tidyverse
|
||||
trinker
|
||||
ui
|
||||
uri
|
||||
wil
|
||||
|
18
man/replace_curly_quote.Rd
Normal file
18
man/replace_curly_quote.Rd
Normal file
@ -0,0 +1,18 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/doc2dd.R
|
||||
\name{replace_curly_quote}
|
||||
\alias{replace_curly_quote}
|
||||
\title{Replace curly apostrophes and quotes from word}
|
||||
\usage{
|
||||
replace_curly_quote(x)
|
||||
}
|
||||
\arguments{
|
||||
\item{x}{character vector}
|
||||
}
|
||||
\value{
|
||||
character vector
|
||||
}
|
||||
\description{
|
||||
Copied from textclean, which has not been updated since 2018 and is not
|
||||
on CRAN. Github:https://github.com/trinker/textclean
|
||||
}
|
52
renv.lock
52
renv.lock
@ -1,6 +1,6 @@
|
||||
{
|
||||
"R": {
|
||||
"Version": "4.3.3",
|
||||
"Version": "4.4.0",
|
||||
"Repositories": [
|
||||
{
|
||||
"Name": "CRAN",
|
||||
@ -138,14 +138,14 @@
|
||||
},
|
||||
"cachem": {
|
||||
"Package": "cachem",
|
||||
"Version": "1.0.8",
|
||||
"Version": "1.1.0",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Requirements": [
|
||||
"fastmap",
|
||||
"rlang"
|
||||
],
|
||||
"Hash": "c35768291560ce302c0a6589f92e837d"
|
||||
"Hash": "cd9a672193789068eb5a2aad65a0dedf"
|
||||
},
|
||||
"cellranger": {
|
||||
"Package": "cellranger",
|
||||
@ -199,16 +199,6 @@
|
||||
"Repository": "CRAN",
|
||||
"Hash": "5d8225445acb167abf7797de48b2ee3c"
|
||||
},
|
||||
"cpp11": {
|
||||
"Package": "cpp11",
|
||||
"Version": "0.4.7",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Requirements": [
|
||||
"R"
|
||||
],
|
||||
"Hash": "5a295d7d963cc5035284dcdbaf334f4e"
|
||||
},
|
||||
"crayon": {
|
||||
"Package": "crayon",
|
||||
"Version": "1.5.2",
|
||||
@ -279,10 +269,10 @@
|
||||
},
|
||||
"fastmap": {
|
||||
"Package": "fastmap",
|
||||
"Version": "1.1.1",
|
||||
"Version": "1.2.0",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Hash": "f7736a18de97dea803bde0a2daaafb27"
|
||||
"Hash": "aa5e1cd11c2d15497494c5292d7ffcc8"
|
||||
},
|
||||
"filelock": {
|
||||
"Package": "filelock",
|
||||
@ -533,13 +523,13 @@
|
||||
},
|
||||
"openssl": {
|
||||
"Package": "openssl",
|
||||
"Version": "2.1.2",
|
||||
"Version": "2.2.0",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Requirements": [
|
||||
"askpass"
|
||||
],
|
||||
"Hash": "ea2475b073243d9d338aa8f086ce973e"
|
||||
"Hash": "2bcca3848e4734eb3b16103bc9aa4b8e"
|
||||
},
|
||||
"openxlsx2": {
|
||||
"Package": "openxlsx2",
|
||||
@ -585,30 +575,6 @@
|
||||
],
|
||||
"Hash": "01f28d4278f15c76cddbea05899c5d6f"
|
||||
},
|
||||
"prettyunits": {
|
||||
"Package": "prettyunits",
|
||||
"Version": "1.2.0",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Requirements": [
|
||||
"R"
|
||||
],
|
||||
"Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7"
|
||||
},
|
||||
"progress": {
|
||||
"Package": "progress",
|
||||
"Version": "1.2.3",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Requirements": [
|
||||
"R",
|
||||
"R6",
|
||||
"crayon",
|
||||
"hms",
|
||||
"prettyunits"
|
||||
],
|
||||
"Hash": "f4625e061cb2865f111b47ff163a5ca6"
|
||||
},
|
||||
"promises": {
|
||||
"Package": "promises",
|
||||
"Version": "1.3.0",
|
||||
@ -785,7 +751,7 @@
|
||||
},
|
||||
"stringi": {
|
||||
"Package": "stringi",
|
||||
"Version": "1.8.3",
|
||||
"Version": "1.8.4",
|
||||
"Source": "Repository",
|
||||
"Repository": "CRAN",
|
||||
"Requirements": [
|
||||
@ -794,7 +760,7 @@
|
||||
"tools",
|
||||
"utils"
|
||||
],
|
||||
"Hash": "058aebddea264f4c99401515182e656a"
|
||||
"Hash": "39e1144fd75428983dc3f63aa53dfa91"
|
||||
},
|
||||
"stringr": {
|
||||
"Package": "stringr",
|
||||
|
25
tests/spelling.Rout.save
Normal file
25
tests/spelling.Rout.save
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
R version 3.4.1 (2017-06-30) -- "Single Candle"
|
||||
Copyright (C) 2017 The R Foundation for Statistical Computing
|
||||
Platform: x86_64-apple-darwin15.6.0 (64-bit)
|
||||
|
||||
R is free software and comes with ABSOLUTELY NO WARRANTY.
|
||||
You are welcome to redistribute it under certain conditions.
|
||||
Type 'license()' or 'licence()' for distribution details.
|
||||
|
||||
R is a collaborative project with many contributors.
|
||||
Type 'contributors()' for more information and
|
||||
'citation()' on how to cite R or R packages in publications.
|
||||
|
||||
Type 'demo()' for some demos, 'help()' for on-line help, or
|
||||
'help.start()' for an HTML browser interface to help.
|
||||
Type 'q()' to quit R.
|
||||
|
||||
> if(requireNamespace('spelling', quietly = TRUE))
|
||||
+ spelling::spell_check_test(vignettes = TRUE, error = FALSE,
|
||||
+ skip_on_cran = TRUE)
|
||||
All Done!
|
||||
>
|
||||
> proc.time()
|
||||
user system elapsed
|
||||
0.372 0.039 0.408
|
@ -1,4 +1,5 @@
|
||||
library(testthat)
|
||||
library(REDCapCAST)
|
||||
|
||||
# testthat::test_dir(here::here("tests/testthat"))
|
||||
test_check("REDCapCAST")
|
||||
|
@ -8,5 +8,7 @@
|
||||
|
||||
# setwd("tests/testthat")
|
||||
|
||||
get_data_location <- function(x)
|
||||
get_data_location <- function(x){
|
||||
# here::here(file.path("tests","testthat","data", x))
|
||||
file.path("data", x)
|
||||
}
|
||||
|
@ -18,33 +18,59 @@ knitr::opts_chunk$set(
|
||||
library(REDCapCAST)
|
||||
```
|
||||
|
||||
# Easy data set to data base workflow
|
||||
# Two different ways to create a data base
|
||||
|
||||
THe first iteration of a dataset to data dictionary function is the `ds2dd()`, which creates a very basic data dictionary with all variables stored as text. This is sufficient for just storing old datasets/spreadsheets securely in REDCap.
|
||||
`REDCapCAST` provides two approaches to creating a data dictionary aimed at helping out in two different cases:
|
||||
|
||||
```{r eval=FALSE}
|
||||
mtcars |>
|
||||
1. Easily create a REDCap data base from an existing data set.
|
||||
|
||||
2. Create a table in Word describing a variables in a data base and use this to create a data base.
|
||||
|
||||
In the following I will try to come with a few suggestions on how to use these approaches.
|
||||
|
||||
## Easy data set to data base workflow
|
||||
|
||||
The first iteration of a dataset to data dictionary function is the `ds2dd()`, which creates a very basic data dictionary with all variables stored as text. This is sufficient for just storing old datasets/spreadsheets securely in REDCap.
|
||||
|
||||
```{r eval=TRUE}
|
||||
d1 <- mtcars |>
|
||||
dplyr::mutate(record_id = seq_len(dplyr::n())) |>
|
||||
ds2dd() |>
|
||||
str()
|
||||
ds2dd()
|
||||
|
||||
d1 |>
|
||||
gt::gt()
|
||||
```
|
||||
|
||||
The more advanced `ds2dd_detailed()` is a natural development. It will try to apply the most common data classes for data validation and will assume that the first column is the id number. It outputs a list with the dataset with modified variable names to comply with REDCap naming conventions and a data dictionary.
|
||||
|
||||
The dataset should be correctly formatted for the data dictionary to preserve as much information as possible.
|
||||
|
||||
```{r eval=FALSE}
|
||||
dd_ls <- mtcars |>
|
||||
dplyr::mutate(record_id = seq_len(dplyr::n())) |>
|
||||
```{r eval=TRUE}
|
||||
d2 <- REDCapCAST::redcapcast_data |>
|
||||
dplyr::mutate(record_id = seq_len(dplyr::n()),
|
||||
region=factor(region)) |>
|
||||
dplyr::select(record_id, dplyr::everything()) |>
|
||||
ds2dd_detailed()
|
||||
dd_ls |>
|
||||
str()
|
||||
(\(.x){
|
||||
.x[!grepl("_complete$",names(.x))]
|
||||
})() |>
|
||||
(\(.x){
|
||||
.x[!grepl("^redcap",names(.x))]
|
||||
})() |>
|
||||
ds2dd_detailed() |>
|
||||
purrr::pluck("meta")
|
||||
|
||||
d2 |>
|
||||
gt::gt()
|
||||
```
|
||||
|
||||
Additional specifications to the DataDictionary can be made manually, or it can be uploaded and modified manually in the graphical user interface on the web page.
|
||||
Additional specifications to the DataDictionary can be made manually, or it can be uploaded and modified manually in the graphical user interface on the REDCap server.
|
||||
|
||||
## Step 3 - Meta data upload
|
||||
## Data base from table
|
||||
|
||||
...instructions and examples are coming...
|
||||
|
||||
|
||||
## Meta data and data upload
|
||||
|
||||
Now the DataDictionary can be exported as a spreadsheet and uploaded or it can be uploaded using the `REDCapR` package (only projects with "Development" status).
|
||||
|
||||
|
@ -14,10 +14,6 @@ knitr::opts_chunk$set(
|
||||
)
|
||||
```
|
||||
|
||||
```{r setup}
|
||||
library(REDCapCAST)
|
||||
```
|
||||
|
||||
To make the easiest possible transition from spreadsheet/dataset to REDCap, I have created a small Shiny app, which adds a graphical interface to the casting of a data dictionary and data upload. Install the package and run the app as follows:
|
||||
|
||||
```{r eval=FALSE}
|
||||
|
Loading…
Reference in New Issue
Block a user