install
source · Clone the upstream repo
git clone https://github.com/FreedomIntelligence/OpenClaw-Medical-Skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/FreedomIntelligence/OpenClaw-Medical-Skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bio-reporting-rmarkdown-reports" ~/.claude/skills/freedomintelligence-openclaw-medical-skills-bio-reporting-rmarkdown-reports && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/FreedomIntelligence/OpenClaw-Medical-Skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/bio-reporting-rmarkdown-reports" ~/.openclaw/skills/freedomintelligence-openclaw-medical-skills-bio-reporting-rmarkdown-reports && rm -rf "$T"
manifest:
skills/bio-reporting-rmarkdown-reports/SKILL.mdsource content
<!--
# COPYRIGHT NOTICE
# This file is part of the "Universal Biomedical Skills" project.
# Copyright (c) 2026 MD BABU MIA, PhD <md.babu.mia@mssm.edu>
# All Rights Reserved.
#
# This code is proprietary and confidential.
# Unauthorized copying of this file, via any medium is strictly prohibited.
#
# Provenance: Authenticated by MD BABU MIA
-->
name: bio-reporting-rmarkdown-reports description: Create reproducible bioinformatics analysis reports with R Markdown including code, results, and visualizations in HTML, PDF, or Word format. Use when generating analysis reports with RMarkdown. tool_type: r primary_tool: rmarkdown measurable_outcome: Execute skill workflow successfully with valid output within 15 minutes. allowed-tools:
- read_file
- run_shell_command
R Markdown Reports
Basic Document Structure
--- title: "RNA-seq Analysis Report" author: "Your Name" date: "`r Sys.Date()`" output: html_document: toc: true toc_float: true code_folding: hide theme: cosmo ---
Setup Chunk
```{r setup, include=FALSE} knitr::opts_chunk$set( echo = TRUE, message = FALSE, warning = FALSE, fig.width = 10, fig.height = 6, fig.align = 'center' ) library(tidyverse) library(DESeq2) library(pheatmap) ```
Code Chunk Options
```{r analysis, echo=TRUE, results='hide'} # echo: show code # results: 'hide', 'asis', 'markup' # include: FALSE hides chunk entirely # eval: FALSE shows code but doesn't run # cache: TRUE caches results ```
Parameterized Reports
--- title: "Sample Report" params: sample_id: "sample1" count_file: "counts.csv" fdr_threshold: 0.05 ---
```{r} counts <- read.csv(params$count_file) sample <- params$sample_id fdr <- params$fdr_threshold ```
# Render with parameters rmarkdown::render('report.Rmd', params = list(sample_id = 'sample2', fdr_threshold = 0.01)) # Batch render samples <- c('sample1', 'sample2', 'sample3') for (s in samples) { rmarkdown::render('report.Rmd', params = list(sample_id = s), output_file = paste0(s, '_report.html')) }
Tables
```{r} # Basic kable table knitr::kable(head(results), caption = 'Top DE genes') # Interactive table with DT library(DT) datatable(results, filter = 'top', options = list(pageLength = 10)) # Formatted table with kableExtra library(kableExtra) results %>% head(10) %>% kable() %>% kable_styling(bootstrap_options = c('striped', 'hover')) %>% row_spec(which(results$padj < 0.01), bold = TRUE, color = 'red') ```
Figures
```{r volcano-plot, fig.cap="Volcano plot of differential expression"} ggplot(results, aes(log2FoldChange, -log10(pvalue))) + geom_point(aes(color = padj < 0.05)) + theme_minimal() ```
Inline Code
We identified `r sum(res$padj < 0.05, na.rm=TRUE)` significantly DE genes (FDR < 0.05) out of `r nrow(res)` tested.
Child Documents
--- title: "Main Report" ---
```{r child='methods.Rmd'} ``` ```{r child='results.Rmd'} ```
PDF Output
--- output: pdf_document: toc: true number_sections: true fig_caption: true latex_engine: xelatex ---
HTML with Tabs
## Results {.tabset} ### PCA Plot ```{r} plotPCA(vsd, intgroup = 'condition') ``` ### Heatmap ```{r} pheatmap(assay(vsd)[top_genes, ]) ```
Caching Long Computations
```{r deseq-analysis, cache=TRUE, cache.extra=tools::md5sum('counts.csv')} # Cached unless counts.csv changes dds <- DESeqDataSetFromMatrix(counts, metadata, ~ condition) dds <- DESeq(dds) ``` ```{r downstream, dependson='deseq-analysis'} # Re-runs when deseq-analysis cache changes res <- results(dds) ```
Custom CSS
--- output: html_document: css: custom.css ---
/* custom.css */ body { font-family: 'Helvetica', sans-serif; } h1 { color: #2c3e50; } .figure { margin: 20px auto; }
Complete Report Template
--- title: "RNA-seq Analysis Report" author: "Bioinformatics Core" date: "`r Sys.Date()`" output: html_document: toc: true toc_float: true code_folding: hide params: count_file: "counts.csv" metadata_file: "metadata.csv" --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE) library(DESeq2) library(tidyverse) library(pheatmap) library(DT) ``` ## Data Overview ```{r load-data} counts <- read.csv(params$count_file, row.names = 1) metadata <- read.csv(params$metadata_file, row.names = 1) ``` Loaded `r nrow(counts)` genes across `r ncol(counts)` samples. ## Differential Expression ```{r de-analysis, cache=TRUE} dds <- DESeqDataSetFromMatrix(counts, metadata, ~ condition) dds <- DESeq(dds) res <- results(dds) %>% as.data.frame() %>% arrange(padj) ``` ## Results ```{r results-table} datatable(res %>% filter(padj < 0.05), options = list(pageLength = 10)) ```
Related Skills
- reporting/quarto-reports - Modern alternative
- data-visualization/ggplot2-fundamentals - Figure creation
- differential-expression/de-visualization - Analysis plots