Community研究與資料分析github.com

mkmiecik14/claude-skills

建立、擴展或稽核專案中 pipeline/ 目錄內以巢狀 Bash 腳本構成的可重現分析管線,讓一個指令(bash pipeline/run_pipeline.sh)就能從原始資料重建所有輸出。當使用者想為 R/Quarto 研究專案設定管線、在現有 pipeline/ 中加入新腳本或階段、依相依性重新排序腳本、檢查所有分析是否都被管線涵蓋,或讓專案從頭到尾可重現時使用。

claude-skills 是什麼?

此技能旨在為 R/Quarto 研究專案建立一套遵循相依性順序的巢狀 Bash 腳本管線。使用者只需執行 `bash pipeline/run_pipeline.sh` 一個指令,即可從原始資料重建所有處理過的資料集、分析結果、報告與手稿輸出。它透過 `pipeline/` 目錄下的階段腳本(如 `run_preprocessing.sh`、`run_analyses.sh`)來依序呼叫對應的 R 或 Quarto 檔案,並提供統一的日誌、錯誤處理與重現性稽核查核。此技能支援主流的 AI 代理平台,並內建模板與檢查工具,有助於確保管線的完整性與語法正確性。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mkmiecik14/claude-skills/tree/HEAD/plugins/mattk-tools/skills/research-pipeline

Installed? Explore more 研究與資料分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

研究管線

目標:從乾淨的 checkout 加上原始 data/ 執行 bash pipeline/run_pipeline.sh 即可重建所有處理過的資料集、分析結果、報告與手稿輸出。每個產生後續步驟所需輸出的腳本,都會依相依順序由 pipeline/ 下的某個腳本呼叫。

目錄結構

pipeline/
  _common.sh            # 共用輔助函式,由每個 run_*.sh 引入(不直接執行)
  run_pipeline.sh       # 頂層協調器:依序呼叫各階段腳本
  run_preprocessing.sh  # 階段:src/prepro/*.R      -> output/prepro/
  run_analyses.sh       # 階段:src/analysis/*.R    -> output/analysis/
  run_reports.sh        # 階段:src/reports/*.qmd   -> output/reports/
  run_manuscript.sh     # 階段:src/manuscript/*    -> output/manuscript/
  run_script.sh         # 執行單一 .R / .qmd 並使用相同的日誌機制

階段名稱遵循專案的 src/ 資料夾名稱(例如 noh-survey 使用 src/manu/ 和 run_manu.sh)。僅為實際存在的資料夾新增階段;不要憑空建立不存在的階段。

慣例

  • 每個腳本使用 #!/usr/bin/env bash 與 set -euo pipefail。
  • 每個腳本開頭加上標頭註解,說明腳本功能、使用方式(bash pipeline/<name>.sh)與必須先執行的階段(Requires ...)。
  • 腳本透過 _common.sh 切換到專案根目錄,因此可從任何目錄執行。所有路徑皆以專案根目錄為相對基準。
  • 日誌:run_pipeline.sh 會匯出 PIPELINE_LOG_DIR=logs/run_pipeline_<timestamp>。每個階段會建立 ${PIPELINE_LOG_DIR:-logs}/run_<stage>_<timestamp>/,因此當透過管線執行時,階段日誌會巢狀在管線執行目錄下;單獨執行時則放在 logs/ 下。每個 R 腳本 / Quarto 文件會建立自己的 <name>_<HH-MM-SS>.txt 日誌檔。
  • 失敗時,run_r / render_qmd 會印出失敗的腳本、其日誌路徑以及日檔最後 20 行,然後停止整個管線。
  • 在階段內部,依照相依深度將呼叫分組,並在每組前加上 echo "=== Layer N: <說明> ===" 標題。對於相依性不明顯的呼叫,在其後方加上註解(# needs output/prepro/redcap-joined.rds)。跨階段的相依性應放在獨立的標籤區塊中(例如,需要 PCA 結果的前處理腳本應放在 PCA 之後的分析階段中)。
  • 每個階段會 mkdir -p 其要寫入的輸出目錄。
  • Quarto 會渲染到來源資料夾,因此 render_qmd 會將結果移到 output/。當某個資料夾中的所有報告都以相同方式渲染時,使用 for qmd in src/reports/*.qmd 迴圈(跳過範本)。
  • 耗時的步驟前加上 echo "NOTE: ... 可能需要較長時間"。
  • 保持呼叫明確,每個腳本一行。不要使用 glob 自動發現 R 腳本:順序即相依圖,且應具有可讀性。

範本

從此技能的 templates/ 目錄複製這些範本並填入內容:

範本轉換為
_common.shpipeline/_common.sh(直接複製)
run_pipeline.shpipeline/run_pipeline.sh
run_stage.sh每個階段一個 pipeline/run_<stage>.sh
run_script.shpipeline/run_script.sh(直接複製)

_common.sh 提供:

  • init_log_dir <stage-name>:建立並設定 LOG_DIR
  • run_r <script.R> [args...]:執行 R 腳本,stdout+stderr 寫入其日誌(args 會加入日誌名稱中,用於參數化執行,如 noh-survey 的 group 迴圈)
  • run_r_console <script.R> <stdout-file>:stdout 另存為交付成果(例如 output/manuscript/<name>-console.txt),stderr 寫入日誌
  • render_qmd <doc.qmd> <dest-dir-or-file> [quarto args...]:渲染並移動輸出;將檔案路徑作為目標可重新命名(例如每個 -P group:... 產生的 PDF)
  • find_quarto:回退到 RStudio/Positron 隨附的 Quarto

工作流程

1. 調查專案

  • 列出 src/(以及 fns/、config/)和任何現有的 pipeline/。如果 pipeline/ 已存在,在更改任何內容前先閱讀每個腳本,並在其風格與這些慣例不同時保留其風格(在遷移已建立的管線前先詢問)。
  • 閱讀專案的 CLAUDE.md / README 以了解已說明的執行順序。

2. 釐清相依順序

針對 src/ 中的每個 .R / .qmd,找出其讀取和寫入的內容:

grep -nE 'readRDS|read_rds|read_csv|read_excel|read\.csv|load\(|fread|readMat|source\(' <file>
grep -nE 'saveRDS|write_rds|write_csv|ggsave|save\(|writexl|write\.csv|pdf\(|png\(|tiff\(' <file>

將每個讀取對應到寫入該檔案的腳本。沒有生產者的讀取必須是 data/ 中的原始輸入;如果不是,則標記它(這可能是缺少的管線步驟,或是手動製作的輸出)。分配層級:第 0 層僅讀取 data/;第 N 層讀取來自層級 < N 的輸出。在撰寫腳本之前,對於任何不明顯的情況,向使用者顯示結果順序。

跳過 archive/、misc/、範本(*template*)和草稿腳本,除非使用者另有說明,並列出跳過的內容。

3. 撰寫腳本

複製範本,填入階段和層級,執行 chmod +x pipeline/*.sh。

4. 檢查涵蓋率與語法

bash <this-skill-dir>/scripts/check_coverage.sh <project-root>

這會對每個管線腳本執行 bash -n 和 shellcheck(若已安裝),然後列出 src/ 中未被任何管線腳本明確提及的檔案。透過 glob 迴圈渲染的檔案會顯示為未提及,因此需要手動檢查。其餘每個檔案都要加入管線,或確認已刻意排除。

5. 重現性稽核

對 src/ 進行 grep 並報告(不要靜默修復)以下任何情況:

  • setwd( 或絕對路徑(/Users/、C:/、~/):會在其他機器上中斷
  • 隨機性(sample(、rnorm(、boot、simr、缺少 set.seed)但沒有 set.seed()
  • 僅限互動式的程式碼:View(、file.choose(、readline(、browser(
  • 輸出寫在 output/ 之外(Quarto 的渲染後移動除外)
  • rm(list = ls()):當腳本在同一個 session 中執行時,會隱藏缺少的相依性

6. 執行

完整管線可能需要很長時間且會覆寫 output/,因此請先詢問再執行。提供先執行單一階段或對單一檔案執行 run_script.sh 的選項。若要檢查從頭開始的可重現性,請將 output/ 移到一旁(mv output output.bak),不要刪除,然後執行 run_pipeline.sh 並比較。

7. 撰寫文件

在專案的 CLAUDE.md / README 中新增或更新「執行管線」小節:說明單一指令、每個階段的作用,以及如何執行單一腳本。

將腳本加入現有管線

  1. 找出新腳本讀取的內容(步驟 2),從而確定其所屬的階段與層級。
  2. 在該處加入一行 run_r,若相依性不明顯則加上相依性註解。
  3. 若其輸出供後續腳本使用,請檢查那些腳本是否仍在後面的層級中。
  4. 執行 scripts/check_coverage.sh。

相關技能