Shiny-apps implementeren
Publiceer apps naar shinyapps.io, Shiny Server en omgevingen met Docker-containers.
Shiny-apps implementeren is een gratis R Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject R Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus R Academy bevat in totaal 4 lessen.
Overzicht van implementatieopties
Shiny-apps kunnen op verschillende platforms worden geïmplementeerd, afhankelijk van budget, verwachte hoeveelheid verkeer en vereisten voor beheer:
- shinyapps.io: Beheerde cloudhosting door Posit — het eenvoudigst, met een gratis abonnement.
- Shiny Server (open source): Zelf gehost op Linux, gratis.
- Posit Connect: Commercieel platform voor ondernemingen, ondersteunt ook R Markdown en Plumber.
- Docker + rocker/shiny: Maximale overdraagbaarheid en controle.
# Summary of deployment options and their trade-offs:
# shinyapps.io: managed, auto-scaling, per-instance pricing
# Shiny Server: self-hosted, unlimited users, needs sysadmin
# Posit Connect: enterprise SSO, scheduling, REST APIs
# Docker: any cloud provider, reproducible environments
cat('Choose based on: scale, budget, infra control needs')Structuur van app.R voor implementatie
Een implementeerbare Shiny-app moet één app.R-bestand hebben (met zowel ui als server) of twee bestanden: ui.R en server.R. Alle pakketafhankelijkheden moeten bovenaan met library() worden gedeclareerd. Gegevensbestanden moeten zich in dezelfde map bevinden of relatief ten opzichte van de app toegankelijk zijn.
# Minimal app.R for deployment
library(shiny)
library(ggplot2)
library(dplyr)
# Load data relative to app directory
data <- readRDS('data/processed_data.rds')
ui <- fluidPage(
titlePanel('My Deployed App'),
sidebarLayout(
sidebarPanel(selectInput('var', 'Variable:', choices = names(data))),
mainPanel(plotOutput('main_plot'))
)
)
server <- function(input, output, session) {
output$main_plot <- renderPlot({
ggplot(data, aes_string(x = input$var)) + geom_histogram()
})
}
shinyApp(ui, server)rsconnect::deployApp()
Het pakket rsconnect verzorgt de implementatie naar shinyapps.io en Posit Connect. Configureer eerst de accountgegevens en roep daarna vanuit de appmap rsconnect::deployApp() aan. Alle R-bestanden, gegevens en een manifest worden automatisch gebundeld.
library(rsconnect)
# One-time setup: link your shinyapps.io account
# rsconnect::setAccountInfo(
# name = 'your_account_name',
# token = 'YOUR_TOKEN',
# secret = 'YOUR_SECRET'
# )
# Deploy the app in the current directory
rsconnect::deployApp(
appDir = '.', # or 'path/to/app'
appName = 'my_analysis_app',
forceUpdate = TRUE
)Instellen van shinyapps.io
shinyapps.io is de snelste manier om een openbare URL te krijgen. Maak een gratis account aan op shinyapps.io, kopieer uw token en geheim uit het dashboard en roep setAccountInfo() aan. Met het gratis abonnement kunt u 5 apps gebruiken met 25 actieve uren per maand.
library(rsconnect)
# Copy credentials from shinyapps.io -> Account -> Tokens
rsconnect::setAccountInfo(
name = 'your_username',
token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
)
# Verify the connection
rsconnect::accountInfo()
# List currently deployed apps
rsconnect::applications()Shiny Server Open Source
Shiny Server draait op Linux (Ubuntu/RHEL) en serveert Shiny-apps vanuit de map /srv/shiny-server/. Elke submap wordt een app op http://server:3838/subdirname/. Het is gratis en ondersteunt een onbeperkt aantal gelijktijdige gebruikers (binnen de capaciteit van de server).
# Install Shiny Server on Ubuntu:
# sudo apt-get install r-base
# sudo R -e 'install.packages(c("shiny", "rmarkdown"))'
# wget https://download3.rstudio.org/ubuntu-20.04/x86_64/shiny-server-1.5.21.1012-amd64.deb
# sudo dpkg -i shiny-server-1.5.21.1012-amd64.deb
# Deploy an app:
# sudo cp -r /path/to/myapp /srv/shiny-server/myapp
# Access at: http://your-server:3838/myapp
# Config file: /etc/shiny-server/shiny-server.conf
cat('Shiny Server config controls ports, auth, and app paths')Docker met rocker/shiny
De Docker-installatiekopie rocker/shiny bevat een vooraf geconfigureerde Shiny Server. Koppel uw appmap aan de container om de app direct te serveren. Docker zorgt voor reproduceerbaarheid — dezelfde installatiekopie werkt identiek op elke host.
# Dockerfile for a custom Shiny app
# FROM rocker/shiny:4.4.0
#
# # Install R package dependencies
# RUN R -e 'install.packages(c("ggplot2","dplyr","DT"))'
#
# # Copy app files
# COPY myapp/ /srv/shiny-server/myapp/
#
# EXPOSE 3838
# Build and run:
# docker build -t my-shiny-app .
# docker run -p 3838:3838 my-shiny-app
# Access at: http://localhost:3838/myapprenv voor reproduceerbare afhankelijkheden
renv maakt een pakketbibliotheek op projectniveau met een vergrendelingsbestand (renv.lock) waarin exacte pakketversies worden vastgelegd. Bij het implementeren zorgt dit vergrendelingsbestand ervoor dat de server of Docker-installatiekopie exact dezelfde pakketversies installeert als tijdens de ontwikkeling.
library(renv)
# Initialise renv in the project (creates renv.lock)
renv::init()
# After installing/updating packages, record the state
renv::snapshot()
# On the server: restore exact versions from lockfile
renv::restore()
# Check lockfile for a specific package version
renv::dependencies() # lists all used packagesOmgevingsvariabelen voor configuratie
Neem API-sleutels, databasewachtwoorden of omgevingsspecifieke instellingen nooit rechtstreeks op in de appcode. Gebruik omgevingsvariabelen die u uitleest met Sys.getenv('VAR_NAME', unset = NA). Stel ze lokaal in via .Renviron en voor productie in de omgevingsconfiguratie van het hostingplatform.
# In .Renviron (never commit this file):
# DB_HOST=prod-db.example.com
# DB_PASSWORD=secret123
# API_KEY=key_abc
# In app.R:
db_host <- Sys.getenv('DB_HOST', unset = 'localhost')
db_pass <- Sys.getenv('DB_PASSWORD', unset = '')
api_key <- Sys.getenv('API_KEY', unset = '')
if (api_key == '') {
warning('API_KEY not set — some features disabled')
}Overzicht van Posit Connect
Posit Connect is het bedrijfsplatform voor het implementeren van Shiny-apps, R Markdown-documenten, Plumber-API's en meer. Het ondersteunt:
- Eenmalige aanmelding (SSO) via LDAP of SAML
- Geplande uitvoering van R Markdown-rapporten
- Toegangsbeheer op appniveau
- Automatisch schalen en taakverdeling
De implementatie gebruikt dezelfde workflow met rsconnect::deployApp() als shinyapps.io.
library(rsconnect)
# Configure connection to Posit Connect server
rsconnect::addServer(
url = 'https://connect.yourcompany.com',
name = 'my_connect_server'
)
# Authenticate with API key
rsconnect::connectApiUser(
account = 'jsmith',
server = 'my_connect_server',
apiKey = Sys.getenv('CONNECT_API_KEY')
)
# Deploy
rsconnect::deployApp(server = 'my_connect_server')Controlelijst vóór implementatie
Controleer vóór u een Shiny-app naar productie implementeert het volgende:
- Alle bestandspaden gebruiken relatieve paden, geen absolute paden.
- Gevoelige gegevens (API-sleutels, wachtwoorden) worden uit omgevingsvariabelen gelezen.
- Pakketafhankelijkheden zijn expliciet vastgelegd met
library()ofrenv.lock. - Grote gegevensbestanden worden één keer bovenaan
server.Rgeladen, niet binnen reactive. - Foutmeldingen geven geen interne informatie vrij aan eindgebruikers.
# Production-hardened app.R patterns
# Load data once at startup (not per-session)
app_data <- readRDS('data/processed.rds') # outside server()
server <- function(input, output, session) {
# Reference app_data directly — already in memory
output$plot <- renderPlot({
subset_data <- app_data[app_data$group == input$grp, ]
plot(subset_data$x, subset_data$y)
})
# Sanitise error messages
tryCatch({
risky_operation()
}, error = function(e) {
showNotification('An error occurred.', type = 'error')
# log the real error internally, not to user
message('Error: ', conditionMessage(e))
})
}Aandachtspunten voor schalen
Shiny-apps zijn gebaseerd op sessies: elke gebruiker krijgt een eigen R-proces (of worker). Strategieën voor schalen:
- Vooraf berekende gegevens laden bij het opstarten in plaats van ze per sessie te berekenen.
- Reactieve caching gebruiken met
bindCache()voor dure berekeningen die tussen sessies worden gedeeld. - Meerdere workers: Shiny Server Pro en Posit Connect starten parallelle R-processen.
- Databasebackends: gebruik DBI/pool voor gelijktijdige toegang tot databases.
library(shiny)
library(pool)
# Create a database connection pool at startup
# (shared across all sessions)
pool <- dbPool(
drv = RPostgres::Postgres(),
host = Sys.getenv('DB_HOST'),
dbname = 'analytics',
user = Sys.getenv('DB_USER'),
password = Sys.getenv('DB_PASSWORD'),
minSize = 2,
maxSize = 10
)
onStop(function() { poolClose(pool) })
server <- function(input, output, session) {
output$tbl <- renderTable({
dbGetQuery(pool, 'SELECT * FROM metrics LIMIT 100')
})
}Korte controle
Wat is de aanbevolen manier om API-sleutels en databasewachtwoorden te beheren in een geïmplementeerde Shiny-app?
Samenvatting: Shiny-apps implementeren
Belangrijkste punten uit Shiny-apps implementeren:
- Implementatieopties: shinyapps.io (eenvoudigst), Shiny Server (zelf gehost), Posit Connect (voor ondernemingen), Docker.
- app.R moet alle afhankelijkheden declareren met
library(); gebruikrenv::snapshot()voor reproduceerbare versies. rsconnect::deployApp()bundelt de app en stuurt deze naar shinyapps.io of Posit Connect.- Docker met
rocker/shinybiedt maximale overdraagbaarheid. - Gebruik
Sys.getenv()voor inloggegevens — neem geheimen nooit rechtstreeks op in de code. - Laad grote gegevensverzamelingen bij het opstarten (buiten
server()) om ze tussen sessies te delen. - Gebruik verbindingspools (pakket
pool) voor gelijktijdige toegang tot databases.
# Minimal production-ready structure
# myapp/
# app.R <- ui + server + shinyApp()
# data/ <- processed datasets
# R/ <- modules and helpers
# renv.lock <- package version snapshot
# .Renviron <- local env vars (gitignored)
# Deploy:
library(rsconnect)
rsconnect::deployApp(
appDir = 'myapp',
appName = 'my_production_app'
)Leer R met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 43
- Lessen
- 159
Veelgestelde vragen
Is de les “Shiny-apps implementeren” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad R Academy, waaronder “Shiny-apps implementeren”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus R Academy bevat in totaal 4 lessen.
Wat leer ik in “Shiny-apps implementeren”?
Publiceer apps naar shinyapps.io, Shiny Server en omgevingen met Docker-containers. Je oefent met R Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met R Academy te beginnen?
Ervaring vooraf is niet nodig. R Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Shiny-apps implementeren”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over R Academy?
Ja. Elke les over R Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Diepgaande kennismaking met reactief programmeren
- Shiny-modules voor hergebruik van code
- Dynamische UI met renderUI en insertUI
- Shiny-apps implementeren