add-rcpp-integration
À propos
Cette compétence intègre Rcpp ou RcppArmadillo dans un package R pour remplacer les fonctions R critiques en termes de performances par du code C++ haute performance. Elle couvre l'ensemble du flux de travail, de la configuration et l'écriture des fonctions C++ à la génération de RcppExports, en passant par les tests et le débogage. Utilisez-la lorsque le profilage confirme un goulot d'étranglement en R, lors de l'interfaçage avec des bibliothèques C/C++ existantes, ou lors de l'implémentation d'algorithmes tels que les boucles et l'algèbre linéaire qui bénéficient de la compilation.
Installation rapide
Claude Code
Recommandénpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/add-rcpp-integrationCopiez et collez cette commande dans Claude Code pour installer cette compétence
Documentation
Add Rcpp Integration
Integrate C++ into R pkg via Rcpp → perf-critical ops.
Use When
- R fn too slow, profile confirms bottleneck
- Interface existing C/C++ libs
- Algos benefit compiled (loops, recursion)
- RcppArmadillo → linear algebra
In
- Required: Existing R pkg
- Required: R fn to replace/augment w/ C++
- Optional: External C++ lib
- Optional: RcppArmadillo? (default: plain Rcpp)
Do
Step 1: Rcpp Infra Setup
usethis::use_rcpp()
Does:
- Creates
src/dir - Adds
Rcpp→ LinkingTo + Imports in DESCRIPTION - Creates
R/packagename-package.Rw/@useDynLib+@importFrom Rcpp sourceCpp - Updates
.gitignorefor compiled
RcppArmadillo:
usethis::use_rcpp_armadillo()
→ src/ created, DESCRIPTION updated Rcpp LinkingTo + Imports, R/packagename-package.R has @useDynLib.
If err: usethis::use_rcpp() fails → manually create src/, add LinkingTo: Rcpp + Imports: Rcpp, add #' @useDynLib packagename, .registration = TRUE + #' @importFrom Rcpp sourceCpp to pkg doc file.
Step 2: Write C++ Fn
Create src/my_function.cpp:
#include <Rcpp.h>
using namespace Rcpp;
//' Compute cumulative sum efficiently
//'
//' @param x A numeric vector
//' @return A numeric vector of cumulative sums
//' @export
// [[Rcpp::export]]
NumericVector cumsum_cpp(NumericVector x) {
int n = x.size();
NumericVector out(n);
out[0] = x[0];
for (int i = 1; i < n; i++) {
out[i] = out[i - 1] + x[i];
}
return out;
}
RcppArmadillo:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
//' Matrix multiplication using Armadillo
//'
//' @param A A numeric matrix
//' @param B A numeric matrix
//' @return The matrix product A * B
//' @export
// [[Rcpp::export]]
arma::mat mat_mult(const arma::mat& A, const arma::mat& B) {
return A * B;
}
→ C++ src at src/my_function.cpp w/ valid // [[Rcpp::export]] + roxygen //' docs.
If err: Verify #include <Rcpp.h> (or <RcppArmadillo.h>), export annotation own line directly above signature, return types map valid Rcpp.
Step 3: Generate RcppExports
Rcpp::compileAttributes()
devtools::document()
→ R/RcppExports.R + src/RcppExports.cpp auto-generated.
If err: Check C++ syntax. Ensure // [[Rcpp::export]] above each exported fn.
Step 4: Verify Compilation
devtools::load_all()
→ Pkg compiles + loads no err.
If err: Check compiler out. Common:
- Missing system headers → install dev libs
- Syntax err → compiler msgs point to line
- Missing
Rcpp::dependsfor RcppArmadillo
Step 5: Tests for Compiled
test_that("cumsum_cpp matches base R", {
x <- c(1, 2, 3, 4, 5)
expect_equal(cumsum_cpp(x), cumsum(x))
})
test_that("cumsum_cpp handles edge cases", {
expect_equal(cumsum_cpp(numeric(0)), numeric(0))
expect_equal(cumsum_cpp(c(NA_real_, 1)), c(NA_real_, NA_real_))
})
→ Tests pass → C++ identical to R + edge cases (empty, NA) correct.
If err: NA fail → add explicit NA checks via NumericVector::is_na(). Empty fail → guard clause zero-length at top.
Step 6: Cleanup Script
Create src/Makevars:
PKG_CXXFLAGS = -O2
Create cleanup in pkg root (CRAN):
#!/bin/sh
rm -f src/*.o src/*.so src/*.dll
Make executable: chmod +x cleanup
→ src/Makevars sets compiler flags, cleanup removes objects. Both at pkg root.
If err: Verify cleanup has exec perms (chmod +x cleanup), Makevars tabs (not spaces) for Makefile rules.
Step 7: Update .Rbuildignore
Handle compiled artifacts:
^src/.*\.o$
^src/.*\.so$
^src/.*\.dll$
→ .Rbuildignore patterns prevent compiled objects in tarball, preserve src + Makevars.
If err: devtools::check() → NOTEs about unexpected files in src/. Adjust patterns → exclude only .o, .so, .dll.
Check
-
devtools::load_all()compiles no warn - Compiled fn produces correct results
- Tests pass edge cases (NA, empty, large)
-
R CMD checkpasses no compile warn - RcppExports generated + committed
- Perf improvement via benchmarks
Traps
- Forget
compileAttributes(): Must regen RcppExports after C++ changes - Int overflow:
doublenotintfor large numerics - Memory mgmt: Rcpp auto-handles for Rcpp types; no manual
delete - NA handling: C++ doesn't know R's NA. Check
Rcpp::NumericVector::is_na() - Platform portability: Avoid platform-specific C++. Test Win, macOS, Linux.
- Missing
@useDynLib: Pkg doc must@useDynLib packagename, .registration = TRUE
→
create-r-package— pkg setup before Rcppwrite-testthat-tests— testing compiled fnssetup-github-actions-ci— CI needs C++ toolchainsubmit-to-cran— compiled pkgs need extra CRAN checks
Dépôt GitHub
Compétences associées
content-collections
MétaCette compétence propose une configuration éprouvée en production pour Content Collections, un outil axé sur TypeScript qui transforme des fichiers Markdown/MDX en collections de données typées de manière sûre avec une validation Zod. Utilisez-la lors de la création de blogs, de sites de documentation ou d'applications Vite + React riches en contenu pour garantir la sécurité de typage et la validation automatique du contenu. Elle couvre tout, de la configuration du plugin Vite et de la compilation MDX à l'optimisation des déploiements et la validation des schémas.
polymarket
MétaCette compétence permet aux développeurs de créer des applications avec la plateforme de marchés prédictifs Polymarket, incluant l'intégration d'API pour le trading et les données de marché. Elle fournit également une diffusion de données en temps réel via WebSocket pour surveiller les transactions en direct et l'activité du marché. Utilisez-la pour mettre en œuvre des stratégies de trading ou pour créer des outils traitant les mises à jour de marché en direct.
creating-opencode-plugins
MétaCette compétence aide les développeurs à créer des plugins OpenCode qui s'interconnectent avec plus de 25 types d'événements tels que les commandes, les fichiers et les opérations LSP. Elle fournit la structure du plugin, les spécifications de l'API événementielle et les modèles d'implémentation pour les modules JavaScript/TypeScript. Utilisez-la lorsque vous avez besoin d'intercepter, de surveiller ou d'étendre le cycle de vie de l'assistant IA OpenCode avec une logique personnalisée pilotée par les événements.
sglang
MétaSGLang est un framework de service LLM haute performance spécialisé dans la génération rapide et structurée pour les workflows JSON, regex et agentiques grâce à son cache de préfixe RadixAttention. Il offre une inférence nettement plus rapide, particulièrement pour les tâches avec des préfixes répétés, ce qui le rend idéal pour les sorties complexes et structurées ainsi que les conversations multi-tours. Choisissez SGLang plutôt que des alternatives comme vLLM lorsque vous avez besoin d'un décodage contraint ou que vous construisez des applications avec un partage étendu de préfixes.
