diff --git a/.lycheeignore b/.lycheeignore index 8b50d369..3a770928 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -9,3 +9,4 @@ https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numb https://go.appsilon.com/demo-apps https://doi.org/10.1177/17407745221123244 https://appsilon.com/static/35215a117d1bc17fac2179f059c3709f/rhino_fda_pilot_r_shiny_app_e-ctd.webm +https://stackoverflow.com/questions/12688717/round-up-from-5#comment110611119_12688836 diff --git a/R/create_blogpost.R b/R/create_blogpost.R index 63cf6cf4..8bd10d06 100644 --- a/R/create_blogpost.R +++ b/R/create_blogpost.R @@ -15,10 +15,10 @@ c( # Fill in the info, e.g.: create_post( - post_name = "iscr_conference", # needs to be character vector (length 1) - post_date = "2024-02-17", # needs to be character vector (length 1) + post_name = "My Blog", # needs to be character vector (length 1) + post_date = "2024-12-01", # needs to be character vector (length 1) description = "", # you can fill the description in later as well - author = c("Pooja Kumari"), # one or more authors are permitted + author = c("My Name"), # one or more authors are permitted cover_image = "pharmaverse", # chose one of the above (see line 8) tags = c("submission", "ADaMs", "conferences", "admiral", "xportr", "metatools", "metacore") # chose (multiple) from line 10 ) diff --git a/inst/WORDLIST.txt b/inst/WORDLIST.txt index 98398c87..9b43906e 100644 --- a/inst/WORDLIST.txt +++ b/inst/WORDLIST.txt @@ -612,3 +612,23 @@ zhu Zhu zMachine zxqguo +amongst +enablement +GxP +now’ +nyone +phar +phriends +PHUSE’s +riskassessment +yay +ari +farrugia +kalappurakal +knoph +michael +michaelrimler +ross +siggaard +stackhouse +sumesh diff --git a/posts/2024-03-04_inside_the__phar.../appendix.R b/posts/2024-03-04_inside_the__phar.../appendix.R new file mode 100644 index 00000000..ece5203f --- /dev/null +++ b/posts/2024-03-04_inside_the__phar.../appendix.R @@ -0,0 +1,78 @@ +# markdown helpers -------------------------------------------------------- + +markdown_appendix <- function(name, content) { + paste(paste("##", name, "{.appendix}"), " ", content, sep = "\n") +} +markdown_link <- function(text, path) { + paste0("[", text, "](", path, ")") +} + + + +# worker functions -------------------------------------------------------- + +insert_source <- function(repo_spec, name, + collection = "posts", + branch = "main", + host = "https://github.com", + text = "source code") { + path <- paste( + host, + repo_spec, + "tree", + branch, + collection, + name, + "code_sections.qmd", + sep = "/" + ) + return(markdown_link(text, path)) +} + +insert_timestamp <- function(tzone = Sys.timezone()) { + time <- lubridate::now(tzone = tzone) + stamp <- as.character(time, tz = tzone, usetz = TRUE) + return(stamp) +} + +insert_lockfile <- function(repo_spec, name, + collection = "posts", + branch = "main", + host = "https://github.com", + text = "R environment") { + path <- paste( + host, + repo_spec, + "tree", + branch, + collection, + name, + "renv.lock", + sep = "/" + ) + return(markdown_link(text, path)) +} + + + +# top level function ------------------------------------------------------ + +insert_appendix <- function(repo_spec, name, collection = "posts") { + appendices <- paste( + markdown_appendix( + name = "Last updated", + content = insert_timestamp() + ), + " ", + markdown_appendix( + name = "Details", + content = paste( + insert_source(repo_spec, name, collection), + insert_lockfile(repo_spec, name, collection), + sep = ", " + ) + ), + sep = "\n" + ) + knitr::asis_output(appendices) +} diff --git a/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.qmd b/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.qmd new file mode 100644 index 00000000..04e21915 --- /dev/null +++ b/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.qmd @@ -0,0 +1,138 @@ +--- +title: "Inside the Pharmaverse" +author: + - name: Michael Rimler +description: "A short blog to help the Pharmaverse community understand how Pharmaverse is governed" +date: "2024-03-04" +# please do not use any non-default categories. +# You can find the default categories in the repository README.md +categories: [community] +# feel free to change the image +image: "pharmaverse.png" +--- + + + +```{r setup, include=FALSE} +long_slug <- "2024-03-04_inside_the__phar..." +# renv::use(lockfile = "renv.lock") +``` + + + +Greetings, Pharmaverse phriends! + +Now that the {pharmaverse} has been around for a few years and seems to be making an impact on clinical reporting (yay!), we wanted to take an opportunity to cast a light on some of the inner workings of Pharmaverse and its Council (us). +Fortunately, some of you (you know who you are) innovated and created this fantastic channel for [Pharmaverse Blogs](https://pharmaverse.github.io/blog/). +We can’t think of a better way to communicate than by the channel that the Pharmaverse community itself created. + +## Pharmaverse Inception + +The Pharmaverse Council was formed in 2020 as a coming together of 4 like-minded individuals embedded in the industry-wide efforts to increase the use of the R language for clinical trial analysis and reporting. +These individuals included [Ross Farrugia](https://www.linkedin.com/in/ross-farrugia-820839204/) (Roche), [Sumesh Kalappurakal](https://www.linkedin.com/in/sumesh-kalappurakal-b8283ab/) (Johnson & Johnson), [Michael Rimler](https://www.linkedin.com/in/michaelrimler/) (GSK), and [Mike Stackhouse](https://www.linkedin.com/in/michael-s-stackhouse/) (Atorus). +Each had historical experience with R adoption, through their primary roles within their respective organizations. + +Collectively, these 4 individuals saw the value in + +(i) reducing the choice set of R packages for users, + +(ii) identifying gaps in available R packages for delivering the clinical data pipeline, and + +(iii) encouraging the development of new packages and/or features to close those gaps. + +The result would be a subset of permissively licensed and open-sourced packages that anyone could use (or modify) to suit their specific use cases, thereby reducing the incidence of organizations privately solving typical problems in isolation. +For more background, please refer to the [Pharmaverse Charter](https://pharmaverse.org/charter/). + +The current Pharmaverse Council companies include GSK, Roche, Johnson & Johnson, Atorus, and Novo Nordisk, represented by the original four founders and [Ari Siggaard Knoph](https://www.linkedin.com/in/ari-siggaard-knoph-7b852575/) from Novo Nordisk. + +In March 2023, the [PHUSE](https://phuse.global/) Board of Directors approached the Pharmaverse Council with a proposal offering support to Pharmaverse developers and leadership to advance the Pharmaverse mission. +The PHUSE proposal aligned with its mission to promote “\[s\]haring ideas, tools and standards around data, statistical and reporting technologies to advance the future of life sciences.” PHUSE is currently a supporter of the Pharmaverse and its objectives, evident through activities such as: + +- the provision of access to PHUSE’s communication and file-sharing platforms to package teams, + +- the provision of project management support to package teams (if needed), + +- enablement and promotion of Pharmaverse innovations and activities, and + +- enablement of face-to-face community connections at PHUSE events. + +## Pharmaverse Objective + +Pharmaverse aims to promote the collaborative development of curated open-source R packages for clinical reporting in pharma. +Indirectly, we also strive to encourage and increase R adoption within the industry and facilitate communication and collaboration among both R users and R developers. + +## Becoming a Council Member + +Membership to the **Pharmaverse Council** is granted to the organization and is open to any type of organization (requirements further described [here](https://pharmaverse.org/contribute/council/)). +In layperson’s terms, the Council member organization must support a representative on the council and demonstrate a commitment to contributions to the Pharmaverse codebase. +Specifically, *“Commitment to at least 2 open source packages under Pharmaverse via reviews, hands-on code development, product leads, or other roles which contribute to the design, development, testing, release, and/or maintenance.”* If any representative steps away from their council position, the member organization would identify the replacement. +Council meeting minutes are published in the Pharmaverse GitHub [here](https://github.com/pharmaverse/pharmaverse/tree/main/static/council%20meeting%20minutes). + +## Package Inclusion + +Applications for a package to be included in the Pharmaverse may originate from anybody and anywhere. +The Council (through its [Working Groups](https://pharmaverse.org/contribute/wg/)) reviews applications and either (i) approves the package into the Pharmaverse or (ii) rejects the package with a rationale. +When a rejection has been issued, common reasons have been ‘not now’ with feedback to enhance testing, documentation, or other aspects that enrich the package. +Working Groups may also steer the applicant to other packages with similar functionality. +In this sense, respective package maintainers (product owners) are encouraged to work collaboratively to reduce duplicated features across packages and improve the overall experience of the user base. +The Council and Working Groups are tasked with assessing this aspect of the Pharmaverse code base, but the decision on implementation ultimately resides with the individual package maintainers. + +Package reviews are conducted in the open: + +- **Example 1:** {riskassessment} from R Validation Hub working group – result successful: + +- **Example 2:** {rhino} from Appsilon – result successful: + +- **Example 3:** {synthetic.cdisc.data} from Roche – result unsuccessful: + +At the time of publication, there were over 250 contributors to Pharmaverse packages, across a network of organizations much broader than just the 5 Council member organizations. +Pharmaverse Council encourages diversity of individual contributors and the organizations they are affiliated with. +The decision on product development team rosters is the sole discretion of the packages. +Of course, Council member organizations are providing people to support the Pharmaverse ecosystem (e.g., developers and product owners). +However, both strategic and operational decisions on the development and maintenance of individual packages reside outside the Pharmaverse Council. + +## User adoption + +Pharma companies are free to choose any selection of R packages for clinical reporting and only they can justify their choices. +The [Pharmaverse website](https://pharmaverse.org/) states that “\[a\]nyone is free to choose any selection of Pharmaverse recommended software or those from any other source.” In addition, Pharmaverse does not seek to engage or get endorsement from any health authority. +We are merely trying to provide a public service to help individuals and organizations involved in clinical reporting navigate a vast field of available R packages licensed as open source. + +The Pharmaverse website provides illustrative [examples](https://pharmaverse.github.io/examples/) of how to use Pharmaverse and other packages to build common deliverables. + +## So, what really is Pharmaverse? + +Pharmaverse is essentially two things: + +1. Pharmaverse is a list of packages curated by the Pharmaverse Council and Working Groups, primarily communicated via the Pharmaverse website. + Pharmaverse also maintains an [R-universe build](https://pharmaverse.r-universe.dev/builds) for ease of use outside GxP settings. + +2. Pharmaverse is a community of R users and R developers “working to promote collaborative development of curated open-source R packages for clinical reporting usage in pharma.” + +Pharmaverse Council provides a [Slack workspace](https://pharmaverse.slack.com/) to build community amongst all interested parties and serve as a communication platform for individuals and package teams. +At present, membership to this workspace exceeds \>1200 members. + +Pharmaverse Council also provides a [GitHub organization](https://github.com/pharmaverse) for developers to work in, but hosting packages in the Pharmaverse GitHub is not required to be part of Pharmaverse. + +These elements are supported on an all-volunteer basis, mostly with community versions of various platforms (e.g., we use the free tier on Slack). + +## Thank you + +Thank you, each of you, for the part that you play. +No matter how big or small, you are helping amplify the impact that open collaboration is having on how we deliver new medicines and vaccines to patients around the world. +We hope you are finding, and continue to find, Pharmaverse a valuable piece of the clinical reporting puzzle. + +And, if not – let us know! + +*Pharmaverse Council – Ari, Michael, Mike, Ross, and Sumesh* + +**Disclaimer:** This blog contains opinions that are of the authors alone and do not necessarily reflect the strategy of their respective organizations. + + + +```{r, echo=FALSE} +source("appendix.R") +insert_appendix( + repo_spec = "pharmaverse/blog", + name = long_slug +) +``` diff --git a/posts/2024-03-04_inside_the__phar.../pharmaverse.png b/posts/2024-03-04_inside_the__phar.../pharmaverse.png new file mode 100644 index 00000000..0d7fc797 Binary files /dev/null and b/posts/2024-03-04_inside_the__phar.../pharmaverse.png differ