MCP HubMCP Hub
Вернуться к навыкам

scaffold-shiny-app

pjt222
Обновлено 2 days ago
1 просмотров
17
2
17
Посмотреть на GitHub
Дизайнdesign

О программе

Этот навык создает каркас новых приложений Shiny на R с тремя вариантами фреймворков: golem для пакетов готовых к продакшену, rhino для корпоративных приложений или vanilla для быстрых прототипов. Он обрабатывает выбор фреймворка, инициализацию проекта и может сгенерировать первый модуль. Используйте его при старте интерактивных веб-приложений на R, прототипов дашбордов или готовых к продакшену приложений Shiny.

Быстрая установка

Claude Code

Рекомендуется
Основной
npx skills add pjt222/agent-almanac -a claude-code
Команда плагинаАльтернативный
/plugin add https://github.com/pjt222/agent-almanac
Git клонированиеАльтернативный
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/scaffold-shiny-app

Скопируйте и вставьте эту команду в Claude Code для установки этого навыка

Документация

Scaffold Shiny App

Create new Shiny w/ prod-ready structure → golem|rhino|vanilla.

Use When

  • New interactive R web app
  • Dashboard|data explorer proto
  • Prod Shiny as R pkg (golem)
  • Enterprise Shiny (rhino)

In

  • Required: App name
  • Required: Framework (golem|rhino|vanilla)
  • Optional: Module scaffold (default yes)
  • Optional: renv (default yes)
  • Optional: Deploy target (shinyapps.io|Posit Connect|Docker)

Do

Step 1: Choose Framework

FrameworkBest ForStructure
golemProduction apps shipped as R packagesR package with DESCRIPTION, tests, vignettes
rhinoEnterprise apps with JS/CSS build pipelinebox modules, Sass, JS bundling, rhino::init()
vanillaQuick prototypes and learningSingle app.R or ui.R/server.R pair

→ Clear decision by scope + team needs.

If err: unsure → default golem (most structure, can simplify). Vanilla only for throwaway protos.

Step 2: Scaffold

Golem

golem::create_golem("myapp", package_name = "myapp")

Creates:

myapp/
├── DESCRIPTION
├── NAMESPACE
├── R/
│   ├── app_config.R
│   ├── app_server.R
│   ├── app_ui.R
│   └── run_app.R
├── dev/
│   ├── 01_start.R
│   ├── 02_dev.R
│   ├── 03_deploy.R
│   └── run_dev.R
├── inst/
│   ├── app/www/
│   └── golem-config.yml
├── man/
├── tests/
│   ├── testthat.R
│   └── testthat/
└── vignettes/

Rhino

rhino::init("myapp")

Creates:

myapp/
├── app/
│   ├── js/
│   ├── logic/
│   ├── static/
│   ├── styles/
│   ├── view/
│   └── main.R
├── tests/
│   ├── cypress/
│   └── testthat/
├── .github/
├── app.R
├── dependencies.R
├── rhino.yml
└── renv.lock

Vanilla

Create app.R:

library(shiny)
library(bslib)

ui <- page_sidebar(
  title = "My App",
  sidebar = sidebar(
    sliderInput("n", "Sample size", 10, 1000, 100)
  ),
  card(
    card_header("Output"),
    plotOutput("plot")
  )
)

server <- function(input, output, session) {
  output$plot <- renderPlot({
    hist(rnorm(input$n), main = "Random Normal")
  })
}

shinyApp(ui, server)

→ Project dir created w/ all scaffold files.

If err: golem → install.packages("golem"). Rhino → remotes::install_github("Appsilon/rhino"). Vanilla → ensure shiny+bslib installed.

Step 3: Configure Deps

Golem/Vanilla

# Initialize renv
renv::init()

# Add core dependencies
usethis::use_package("shiny")
usethis::use_package("bslib")
usethis::use_package("DT")         # if using data tables
usethis::use_package("plotly")     # if using interactive plots

# Snapshot
renv::snapshot()

Rhino

Deps managed in dependencies.R:

# dependencies.R
library(shiny)
library(bslib)
library(DT)

→ All deps recorded in DESCRIPTION (golem) | dependencies.R (rhino) + renv-locked.

If err: renv::init() fails → check write perms. Pkg install fails → check R ver compat.

Step 4: First Module

Golem

golem::add_module(name = "dashboard", with_test = TRUE)

Creates R/mod_dashboard.R + tests/testthat/test-mod_dashboard.R.

Rhino

Create app/view/dashboard.R:

box::use(
  shiny[moduleServer, NS, tagList, h3, plotOutput, renderPlot],
)

#' @export
ui <- function(id) {
  ns <- NS(id)
  tagList(
    h3("Dashboard"),
    plotOutput(ns("plot"))
  )
}

#' @export
server <- function(id) {
  moduleServer(id, function(input, output, session) {
    output$plot <- renderPlot({
      plot(1:10)
    })
  })
}

Vanilla

Add to R/mod_dashboard.R:

dashboardUI <- function(id) {
  ns <- NS(id)
  tagList(
    h3("Dashboard"),
    plotOutput(ns("plot"))
  )
}

dashboardServer <- function(id) {
  moduleServer(id, function(input, output, session) {
    output$plot <- renderPlot({
      plot(1:10)
    })
  })
}

→ Module file w/ UI+server using proper namespacing.

If err: ensure NS(id) for all input/output IDs in UI fn. Without → IDs collide on multi-use.

Step 5: Run

# Golem
golem::run_dev()

# Rhino
shiny::runApp()

# Vanilla
shiny::runApp("app.R")

→ App launches in browser w/o errs.

If err: check R console. Common: missing pkgs (install), port in use (port = 3839), syntax errs in UI/server.

Check

  • App dir has correct structure for framework
  • shiny::runApp() launches w/o errs
  • ≥1 module w/ UI+server
  • Deps recorded (DESCRIPTION|dependencies.R)
  • renv.lock captures vers
  • Module uses NS(id) for namespace isolation

Traps

  • Vanilla for prod: Lacks tests, docs, deploy tooling. Use golem|rhino beyond protos.
  • Missing namespace in modules: Every inputId+outputId must wrap ns(). Forget → silent ID collisions.
  • golem w/o devtools: golem apps are R pkgs. Use devtools::load_all(), test(), document() — not source().
  • rhino w/o box: rhino uses box for imports. Don't fall back to library() — use box::use().

  • build-shiny-module — reusable modules w/ namespace isolation
  • test-shiny-app — shinytest2 + testServer() tests
  • deploy-shiny-app — deploy to shinyapps.io, Posit Connect, Docker
  • design-shiny-ui — bslib theming + responsive
  • create-r-package — R pkg scaffold (golem apps are R pkgs)
  • manage-renv-dependencies — detailed renv mgmt

GitHub репозиторий

pjt222/agent-almanac
Путь: i18n/caveman-ultra/skills/scaffold-shiny-app
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Похожие навыки

executing-plans

Дизайн

Используйте навык executing-plans, когда у вас есть полный план реализации для выполнения контролируемыми партиями с контрольными точками проверки. Он загружает и критически анализирует план, затем выполняет задачи небольшими партиями (по умолчанию 3 задачи), сообщая о прогрессе между каждой партией для проверки архитектором. Это обеспечивает систематическую реализацию со встроенными контрольными точками проверки качества.

Просмотреть навык

requesting-code-review

Дизайн

Этот навык запускает суб-агента для ревью кода, который анализирует изменения в коде на соответствие требованиям перед дальнейшими действиями. Его следует использовать после завершения задач, реализации крупных функций или перед слиянием с основной веткой. Ревью помогает выявить проблемы на ранней стадии, сравнивая текущую реализацию с исходным планом.

Просмотреть навык

connect-mcp-server

Дизайн

Этот навык предоставляет разработчикам подробное руководство по подключению серверов MCP к Claude Code с использованием транспортов HTTP, stdio или SSE. Он охватывает установку, конфигурацию, аутентификацию и безопасность для интеграции внешних сервисов, таких как GitHub, Notion и пользовательские API. Используйте его при настройке интеграций MCP, конфигурации внешних инструментов или работе с Model Context Protocol от Claude.

Просмотреть навык

web-cli-teleport

Дизайн

Этот навык помогает разработчикам выбирать между веб-интерфейсом Claude Code и CLI на основе анализа задачи, а также обеспечивает бесшовное перемещение сессий между этими средами. Он оптимизирует рабочий процесс, управляя состоянием и контекстом сессии при переключении между веб-интерфейсом, CLI или мобильным приложением. Используйте его для сложных проектов, требующих различных инструментов на разных этапах работы.

Просмотреть навык