Skip to content

Instantly share code, notes, and snippets.

@arraytools
Last active December 24, 2023 00:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arraytools/7e7bd709a853d3339590506576bea3b0 to your computer and use it in GitHub Desktop.
Save arraytools/7e7bd709a853d3339590506576bea3b0 to your computer and use it in GitHub Desktop.
RenvDocker example for Docker + Shiny. See https://appsilon.com/renv-with-docker/ for more details.
# Base R Shiny image
FROM rocker/shiny
# Make a directory in the container
RUN mkdir /home/shiny-app
# Install Renv
RUN R -e "install.packages('renv', repos = c(CRAN = 'https://cloud.r-project.org'))"
# Copy Renv files and Shiny app
WORKDIR /home/shiny-app/
RUN mkdir -p renv
COPY app.R app.R
COPY renv.lock renv.lock
COPY .Rprofile .Rprofile
COPY renv/activate.R renv/activate.R
COPY renv/settings.json renv/settings.json
# Restore the R environment
RUN R -e "renv::restore()"
# Expose the application port
EXPOSE 8180
# Run the R Shiny app
CMD Rscript /home/shiny-app/app.R
{
"R": {
"Version": "4.3.2",
"Repositories": [
{
"Name": "CRAN",
"URL": "https://packagemanager.posit.co/cran/latest"
}
]
},
"Packages": {
"MASS": {
"Package": "MASS",
"Version": "7.3-60",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"grDevices",
"graphics",
"methods",
"stats",
"utils"
],
"Hash": "a56a6365b3fa73293ea8d084be0d9bb0"
},
"Matrix": {
"Package": "Matrix",
"Version": "1.6-1.1",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"grDevices",
"graphics",
"grid",
"lattice",
"methods",
"stats",
"utils"
],
"Hash": "1a00d4828f33a9d690806e98bd17150c"
},
"R6": {
"Package": "R6",
"Version": "2.5.1",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R"
],
"Hash": "470851b6d5d0ac559e9d01bb352b4021"
},
"RColorBrewer": {
"Package": "RColorBrewer",
"Version": "1.1-3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R"
],
"Hash": "45f0398006e83a5b10b72a90663d8d8c"
},
"Rcpp": {
"Package": "Rcpp",
"Version": "1.0.11",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"methods",
"utils"
],
"Hash": "ae6cbbe1492f4de79c45fce06f967ce8"
},
"base64enc": {
"Package": "base64enc",
"Version": "0.1-3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R"
],
"Hash": "543776ae6848fde2f48ff3816d0628bc"
},
"bslib": {
"Package": "bslib",
"Version": "0.6.1",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"base64enc",
"cachem",
"grDevices",
"htmltools",
"jquerylib",
"jsonlite",
"lifecycle",
"memoise",
"mime",
"rlang",
"sass"
],
"Hash": "c0d8599494bc7fb408cd206bbdd9cab0"
},
"cachem": {
"Package": "cachem",
"Version": "1.0.8",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"fastmap",
"rlang"
],
"Hash": "c35768291560ce302c0a6589f92e837d"
},
"cli": {
"Package": "cli",
"Version": "3.6.2",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"utils"
],
"Hash": "1216ac65ac55ec0058a6f75d7ca0fd52"
},
"colorspace": {
"Package": "colorspace",
"Version": "2.1-0",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"grDevices",
"graphics",
"methods",
"stats"
],
"Hash": "f20c47fd52fae58b4e377c37bb8c335b"
},
"commonmark": {
"Package": "commonmark",
"Version": "1.9.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d691c61bff84bd63c383874d2d0c3307"
},
"crayon": {
"Package": "crayon",
"Version": "1.5.2",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"grDevices",
"methods",
"utils"
],
"Hash": "e8a1e41acf02548751f45c718d55aa6a"
},
"digest": {
"Package": "digest",
"Version": "0.6.33",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"utils"
],
"Hash": "b18a9cf3c003977b0cc49d5e76ebe48d"
},
"dplyr": {
"Package": "dplyr",
"Version": "1.1.4",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"R6",
"cli",
"generics",
"glue",
"lifecycle",
"magrittr",
"methods",
"pillar",
"rlang",
"tibble",
"tidyselect",
"utils",
"vctrs"
],
"Hash": "fedd9d00c2944ff00a0e2696ccf048ec"
},
"ellipsis": {
"Package": "ellipsis",
"Version": "0.3.2",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"rlang"
],
"Hash": "bb0eec2fe32e88d9e2836c2f73ea2077"
},
"fansi": {
"Package": "fansi",
"Version": "1.0.6",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"grDevices",
"utils"
],
"Hash": "962174cf2aeb5b9eea581522286a911f"
},
"farver": {
"Package": "farver",
"Version": "2.1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8106d78941f34855c440ddb946b8f7a5"
},
"fastmap": {
"Package": "fastmap",
"Version": "1.1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f7736a18de97dea803bde0a2daaafb27"
},
"fontawesome": {
"Package": "fontawesome",
"Version": "0.5.2",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"htmltools",
"rlang"
],
"Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d"
},
"fs": {
"Package": "fs",
"Version": "1.6.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"methods"
],
"Hash": "47b5f30c720c23999b913a1a635cf0bb"
},
"gapminder": {
"Package": "gapminder",
"Version": "1.0.0",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"tibble"
],
"Hash": "3a6fab978494586e851b8763996821d6"
},
"generics": {
"Package": "generics",
"Version": "0.1.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"methods"
],
"Hash": "15e9634c0fcd294799e9b2e929ed1b86"
},
"ggplot2": {
"Package": "ggplot2",
"Version": "3.4.4",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"MASS",
"R",
"cli",
"glue",
"grDevices",
"grid",
"gtable",
"isoband",
"lifecycle",
"mgcv",
"rlang",
"scales",
"stats",
"tibble",
"vctrs",
"withr"
],
"Hash": "313d31eff2274ecf4c1d3581db7241f9"
},
"glue": {
"Package": "glue",
"Version": "1.6.2",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"methods"
],
"Hash": "4f2596dfb05dac67b9dc558e5c6fba2e"
},
"gtable": {
"Package": "gtable",
"Version": "0.3.4",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"cli",
"glue",
"grid",
"lifecycle",
"rlang"
],
"Hash": "b29cf3031f49b04ab9c852c912547eef"
},
"htmltools": {
"Package": "htmltools",
"Version": "0.5.7",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"base64enc",
"digest",
"ellipsis",
"fastmap",
"grDevices",
"rlang",
"utils"
],
"Hash": "2d7b3857980e0e0d0a1fd6f11928ab0f"
},
"httpuv": {
"Package": "httpuv",
"Version": "1.6.13",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"R6",
"Rcpp",
"later",
"promises",
"utils"
],
"Hash": "d23d2879001f3d82ee9dc38a9ef53c4c"
},
"isoband": {
"Package": "isoband",
"Version": "0.2.7",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"grid",
"utils"
],
"Hash": "0080607b4a1a7b28979aecef976d8bc2"
},
"jquerylib": {
"Package": "jquerylib",
"Version": "0.1.4",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"htmltools"
],
"Hash": "5aab57a3bd297eee1c1d862735972182"
},
"jsonlite": {
"Package": "jsonlite",
"Version": "1.8.8",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"methods"
],
"Hash": "e1b9c55281c5adc4dd113652d9e26768"
},
"labeling": {
"Package": "labeling",
"Version": "0.4.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"graphics",
"stats"
],
"Hash": "b64ec208ac5bc1852b285f665d6368b3"
},
"later": {
"Package": "later",
"Version": "1.3.2",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"Rcpp",
"rlang"
],
"Hash": "a3e051d405326b8b0012377434c62b37"
},
"lattice": {
"Package": "lattice",
"Version": "0.22-5",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"grDevices",
"graphics",
"grid",
"stats",
"utils"
],
"Hash": "7c5e89f04e72d6611c77451f6331a091"
},
"lifecycle": {
"Package": "lifecycle",
"Version": "1.0.4",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"cli",
"glue",
"rlang"
],
"Hash": "b8552d117e1b808b09a832f589b79035"
},
"magrittr": {
"Package": "magrittr",
"Version": "2.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R"
],
"Hash": "7ce2733a9826b3aeb1775d56fd305472"
},
"memoise": {
"Package": "memoise",
"Version": "2.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"cachem",
"rlang"
],
"Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
},
"mgcv": {
"Package": "mgcv",
"Version": "1.9-0",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"Matrix",
"R",
"graphics",
"methods",
"nlme",
"splines",
"stats",
"utils"
],
"Hash": "086028ca0460d0c368028d3bda58f31b"
},
"mime": {
"Package": "mime",
"Version": "0.12",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"tools"
],
"Hash": "18e9c28c1d3ca1560ce30658b22ce104"
},
"munsell": {
"Package": "munsell",
"Version": "0.5.0",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"colorspace",
"methods"
],
"Hash": "6dfe8bf774944bd5595785e3229d8771"
},
"nlme": {
"Package": "nlme",
"Version": "3.1-163",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"graphics",
"lattice",
"stats",
"utils"
],
"Hash": "8d1938040a05566f4f7a14af4feadd6b"
},
"pillar": {
"Package": "pillar",
"Version": "1.9.0",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"cli",
"fansi",
"glue",
"lifecycle",
"rlang",
"utf8",
"utils",
"vctrs"
],
"Hash": "15da5a8412f317beeee6175fbc76f4bb"
},
"pkgconfig": {
"Package": "pkgconfig",
"Version": "2.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"utils"
],
"Hash": "01f28d4278f15c76cddbea05899c5d6f"
},
"promises": {
"Package": "promises",
"Version": "1.2.1",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R6",
"Rcpp",
"fastmap",
"later",
"magrittr",
"rlang",
"stats"
],
"Hash": "0d8a15c9d000970ada1ab21405387dee"
},
"rappdirs": {
"Package": "rappdirs",
"Version": "0.3.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R"
],
"Hash": "5e3c5dc0b071b21fa128676560dbe94d"
},
"renv": {
"Package": "renv",
"Version": "1.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"utils"
],
"Hash": "41b847654f567341725473431dd0d5ab"
},
"rlang": {
"Package": "rlang",
"Version": "1.1.2",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"utils"
],
"Hash": "50a6dbdc522936ca35afc5e2082ea91b"
},
"sass": {
"Package": "sass",
"Version": "0.4.8",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R6",
"fs",
"htmltools",
"rappdirs",
"rlang"
],
"Hash": "168f9353c76d4c4b0a0bbf72e2c2d035"
},
"scales": {
"Package": "scales",
"Version": "1.3.0",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"R6",
"RColorBrewer",
"cli",
"farver",
"glue",
"labeling",
"lifecycle",
"munsell",
"rlang",
"viridisLite"
],
"Hash": "c19df082ba346b0ffa6f833e92de34d1"
},
"shiny": {
"Package": "shiny",
"Version": "1.8.0",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"R6",
"bslib",
"cachem",
"commonmark",
"crayon",
"ellipsis",
"fastmap",
"fontawesome",
"glue",
"grDevices",
"htmltools",
"httpuv",
"jsonlite",
"later",
"lifecycle",
"methods",
"mime",
"promises",
"rlang",
"sourcetools",
"tools",
"utils",
"withr",
"xtable"
],
"Hash": "3a1f41807d648a908e3c7f0334bf85e6"
},
"sourcetools": {
"Package": "sourcetools",
"Version": "0.1.7-1",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R"
],
"Hash": "5f5a7629f956619d519205ec475fe647"
},
"tibble": {
"Package": "tibble",
"Version": "3.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"fansi",
"lifecycle",
"magrittr",
"methods",
"pillar",
"pkgconfig",
"rlang",
"utils",
"vctrs"
],
"Hash": "a84e2cc86d07289b3b6f5069df7a004c"
},
"tidyselect": {
"Package": "tidyselect",
"Version": "1.2.0",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"cli",
"glue",
"lifecycle",
"rlang",
"vctrs",
"withr"
],
"Hash": "79540e5fcd9e0435af547d885f184fd5"
},
"utf8": {
"Package": "utf8",
"Version": "1.2.4",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R"
],
"Hash": "62b65c52671e6665f803ff02954446e9"
},
"vctrs": {
"Package": "vctrs",
"Version": "0.6.5",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"cli",
"glue",
"lifecycle",
"rlang"
],
"Hash": "c03fa420630029418f7e6da3667aac4a"
},
"viridisLite": {
"Package": "viridisLite",
"Version": "0.4.2",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R"
],
"Hash": "c826c7c4241b6fc89ff55aaea3fa7491"
},
"withr": {
"Package": "withr",
"Version": "2.5.2",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R",
"grDevices",
"graphics",
"stats"
],
"Hash": "4b25e70111b7d644322e9513f403a272"
},
"xtable": {
"Package": "xtable",
"Version": "1.8-4",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"stats",
"utils"
],
"Hash": "b8acdf8af494d9ec19ccb2481a9b11c2"
}
}
}
# The filename should be app.R
library(shiny)
library(dplyr)
library(ggplot2)
library(gapminder)
# Specify the application port
options(shiny.host = "0.0.0.0")
options(shiny.port = 8180)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
tags$h4("Gapminder Dashboard"),
tags$hr(),
selectInput(inputId = "inContinent", label = "Continent", choices = unique(gapminder$continent), selected = "Europe")
),
mainPanel(
plotOutput(outputId = "outChartLifeExp"),
plotOutput(outputId = "outChartGDP")
)
)
)
server <- function(input, output, session) {
# Filter data and store as reactive value
data <- reactive({
gapminder %>%
filter(continent == input$inContinent) %>%
group_by(year) %>%
summarise(
AvgLifeExp = round(mean(lifeExp)),
AvgGdpPercap = round(mean(gdpPercap), digits = 2)
)
})
# Common properties for charts
chart_theme <- ggplot2::theme(
plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),
axis.title.x = element_text(size = 15),
axis.title.y = element_text(size = 15),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12)
)
# Render Life Exp chart
output$outChartLifeExp <- renderPlot({
ggplot(data(), aes(x = year, y = AvgLifeExp)) +
geom_col(fill = "#0099f9") +
geom_text(aes(label = AvgLifeExp), vjust = 2, size = 6, color = "#ffffff") +
labs(title = paste("Average life expectancy in", input$inContinent)) +
theme_classic() +
chart_theme
})
# Render GDP chart
output$outChartGDP <- renderPlot({
ggplot(data(), aes(x = year, y = AvgGdpPercap)) +
geom_line(color = "#f96000", size = 2) +
geom_point(color = "#f96000", size = 5) +
geom_label(
aes(label = AvgGdpPercap),
nudge_x = 0.25,
nudge_y = 0.25
) +
labs(title = paste("Average GDP per capita in", input$inContinent)) +
theme_classic() +
chart_theme
})
}
shinyApp(ui = ui, server = server)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment