การนำแอป Shiny ไปใช้งาน
เผยแพร่แอปไปยัง shinyapps.io, Shiny Server และสภาพแวดล้อมที่ใช้ Docker
การนำแอป Shiny ไปใช้งาน เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมตัวเลือกการนำไปใช้งาน
สามารถนำแอป Shiny ไปใช้งานบนแพลตฟอร์มต่าง ๆ ได้หลายรูปแบบ ขึ้นอยู่กับงบประมาณ ปริมาณการใช้งานที่คาดการณ์ไว้ และระดับการควบคุมที่ต้องการ:
- shinyapps.io: บริการโฮสต์บนคลาวด์ที่ Posit จัดการให้ — ใช้งานง่ายที่สุด และมีแพ็กเกจฟรี
- Shiny Server (โอเพนซอร์ส): โฮสต์ด้วยตนเองบน Linux และใช้งานได้ฟรี
- Posit Connect: เชิงพาณิชย์ระดับองค์กร รองรับ R Markdown และ Plumber ด้วย
- Docker + rocker/shiny: ให้ความสามารถในการย้ายระบบและการควบคุมสูงสุด
# 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')โครงสร้าง app.R สำหรับการนำไปใช้งาน
แอป Shiny ที่พร้อมนำไปใช้งานต้องมีไฟล์ app.R เพียงไฟล์เดียว (ซึ่งมีทั้ง ui และ server) หรือมีสองไฟล์คือ ui.R และ server.R ต้องประกาศแพ็กเกจที่ต้องใช้ทั้งหมดด้วย library() ไว้ด้านบนสุด ไฟล์ข้อมูลต้องอยู่ในไดเรกทอรีเดียวกัน หรือสามารถเข้าถึงได้ด้วยพาธสัมพัทธ์จากแอป
# 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()
แพ็กเกจ rsconnect จัดการการนำไปใช้งานบน shinyapps.io และ Posit Connect ขั้นแรก ให้กำหนดค่าข้อมูลรับรองบัญชี จากนั้นเรียกใช้ rsconnect::deployApp() จากไดเรกทอรีของแอป ฟังก์ชันนี้จะรวมไฟล์ R ข้อมูล และไฟล์กำกับทั้งหมดให้โดยอัตโนมัติ
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
)การตั้งค่า shinyapps.io
shinyapps.io เป็นวิธีที่รวดเร็วที่สุดในการสร้าง URL สาธารณะ ให้สร้างบัญชีฟรีที่ shinyapps.io คัดลอกโทเค็นและรหัสลับจากแดชบอร์ด แล้วเรียกใช้ setAccountInfo() แพ็กเกจฟรีอนุญาตให้มีแอปได้ 5 แอป และใช้งานได้ 25 ชั่วโมงต่อเดือน
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 โอเพนซอร์ส
Shiny Server ทำงานบน Linux (Ubuntu/RHEL) และให้บริการแอป Shiny จากไดเรกทอรี /srv/shiny-server/ แต่ละไดเรกทอรีย่อยจะกลายเป็นแอปที่ http://server:3838/subdirname/ บริการนี้ใช้งานได้ฟรีและรองรับผู้ใช้พร้อมกันได้ไม่จำกัดจำนวน (ภายในขีดความสามารถของเซิร์ฟเวอร์)
# 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 ร่วมกับ rocker/shiny
อิมเมจ Docker rocker/shiny มี Shiny Server ที่กำหนดค่าไว้ล่วงหน้าแล้ว เพียงเมานต์ไดเรกทอรีแอปเข้าไปในคอนเทนเนอร์ ก็สามารถให้บริการแอปได้ทันที Docker ช่วยให้การทำงานทำซ้ำได้อย่างสม่ำเสมอ — อิมเมจเดียวกันจะทำงานเหมือนกันบนโฮสต์ใด ๆ
# 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 สำหรับการจัดการแพ็กเกจที่ทำซ้ำได้
renv สร้างคลังแพ็กเกจระดับโครงการ พร้อมไฟล์ล็อก (renv.lock) ที่บันทึกเวอร์ชันแพ็กเกจอย่างถูกต้อง เมื่อมีการนำไปใช้งาน ไฟล์ล็อกนี้จะทำให้เซิร์ฟเวอร์หรืออิมเมจ Docker ติดตั้งแพ็กเกจเวอร์ชันเดียวกับที่ใช้ระหว่างการพัฒนาโดย точно
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 packagesตัวแปรสภาพแวดล้อมสำหรับการกำหนดค่า
อย่าฝังคีย์ API รหัสผ่านฐานข้อมูล หรือการตั้งค่าเฉพาะสภาพแวดล้อมไว้ในโค้ดแอปโดยตรง ให้ใช้ตัวแปรสภาพแวดล้อมและอ่านค่าด้วย Sys.getenv('VAR_NAME', unset = NA) กำหนดตัวแปรเหล่านี้ไว้ใน .Renviron สำหรับเครื่องที่ใช้พัฒนา และกำหนดไว้ในการตั้งค่าสภาพแวดล้อมของแพลตฟอร์มโฮสต์สำหรับระบบจริง
# 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')
}ภาพรวม Posit Connect
Posit Connect เป็นแพลตฟอร์มระดับองค์กรสำหรับนำแอป Shiny เอกสาร R Markdown, API ของ Plumber และเนื้อหาอื่น ๆ ไปใช้งาน โดยรองรับ:
- การลงชื่อเข้าใช้ครั้งเดียว (SSO) ผ่าน LDAP หรือ SAML
- การเรียกใช้รายงาน R Markdown ตามกำหนดเวลา
- การควบคุมสิทธิ์การเข้าถึงในระดับแอป
- การปรับขนาดและการกระจายโหลดโดยอัตโนมัติ
การนำไปใช้งานใช้ขั้นตอนเดียวกับ shinyapps.io ผ่าน rsconnect::deployApp()
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')รายการตรวจสอบก่อนนำไปใช้งาน
ก่อนนำแอป Shiny ไปใช้งานในระบบจริง ให้ตรวจสอบว่า:
- พาธไฟล์ทั้งหมดเป็นพาธสัมพัทธ์ ไม่ใช่พาธสัมบูรณ์
- ข้อมูลที่ละเอียดอ่อน (คีย์ API และรหัสผ่าน) อ่านจากตัวแปรสภาพแวดล้อม
- ประกาศแพ็กเกจที่ต้องใช้อย่างชัดเจนด้วย
library()หรือrenv.lock - โหลดไฟล์ข้อมูลขนาดใหญ่เพียงครั้งเดียวที่ด้านบนของ server.R (ไม่ใช่ภายใน reactive)
- ข้อความข้อผิดพลาดไม่เปิดเผยข้อมูลภายในแก่ผู้ใช้ปลายทาง
# 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))
})
}ข้อควรพิจารณาในการปรับขนาด
แอป Shiny ทำงานโดยอิงเซสชัน: ผู้ใช้แต่ละคนจะได้รับกระบวนการ R (หรือผู้ปฏิบัติงาน) ของตนเอง กลยุทธ์การปรับขนาดมีดังนี้:
- โหลดข้อมูลที่คำนวณไว้ล่วงหน้า เมื่อเริ่มต้นแอป แทนการคำนวณใหม่ในแต่ละเซสชัน
- ใช้แคชแบบ reactive ร่วมกับ
bindCache()สำหรับการคำนวณที่ใช้เวลานานและใช้ร่วมกันระหว่างเซสชัน - ผู้ปฏิบัติงานหลายตัว: Shiny Server Pro และ Posit Connect สร้างกระบวนการ R แบบขนาน
- ระบบเบื้องหลังฐานข้อมูล: ใช้ DBI/pool เพื่อเข้าถึงฐานข้อมูลพร้อมกัน
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')
})
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
วิธีที่แนะนำในการจัดการคีย์ API และรหัสผ่านฐานข้อมูลในแอป Shiny ที่นำไปใช้งานแล้วคืออะไร
สรุปการนำแอป Shiny ไปใช้งาน
ประเด็นสำคัญจากบทการนำแอป Shiny ไปใช้งาน:
- ตัวเลือกการนำไปใช้งาน: shinyapps.io (ง่ายที่สุด), Shiny Server (โฮสต์ด้วยตนเอง), Posit Connect (ระดับองค์กร), Docker
- app.R ต้องประกาศแพ็กเกจที่ต้องใช้ทั้งหมดด้วย
library()และใช้renv::snapshot()เพื่อให้ได้เวอร์ชันที่ทำซ้ำได้ rsconnect::deployApp()จะรวมและส่งแอปไปยัง shinyapps.io หรือ Posit Connect- Docker ร่วมกับ
rocker/shinyให้ความสามารถในการย้ายระบบสูงสุด - ใช้
Sys.getenv()สำหรับข้อมูลรับรอง — อย่าฝังข้อมูลลับไว้ในโค้ดโดยตรง - โหลดชุดข้อมูลขนาดใหญ่เมื่อเริ่มต้นแอป (นอก
server()) เพื่อใช้ร่วมกันระหว่างเซสชัน - ใช้กลุ่มการเชื่อมต่อ (แพ็กเกจ
pool) เพื่อเข้าถึงฐานข้อมูลพร้อมกัน
# 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'
)คำถามที่พบบ่อย
บทเรียน “การนำแอป Shiny ไปใช้งาน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การนำแอป Shiny ไปใช้งาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การนำแอป Shiny ไปใช้งาน”
เผยแพร่แอปไปยัง shinyapps.io, Shiny Server และสภาพแวดล้อมที่ใช้ Docker คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การนำแอป Shiny ไปใช้งาน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เจาะลึกการเขียนโปรแกรมแบบรีแอกทีฟ
- โมดูล Shiny เพื่อการนำโค้ดกลับมาใช้ใหม่
- ส่วนติดต่อผู้ใช้แบบไดนามิกด้วย renderUI และ insertUI
- การนำแอป Shiny ไปใช้งาน