0Pricing
R Academy · บทเรียน

การนำแอป 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/myapp

renv สำหรับการจัดการแพ็กเกจที่ทำซ้ำได้

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เจาะลึกการเขียนโปรแกรมแบบรีแอกทีฟ
  2. โมดูล Shiny เพื่อการนำโค้ดกลับมาใช้ใหม่
  3. ส่วนติดต่อผู้ใช้แบบไดนามิกด้วย renderUI และ insertUI
  4. การนำแอป Shiny ไปใช้งาน
← กลับไปที่ R Academy