add-rcpp-integration
关于
This Claude Skill helps developers integrate Rcpp or RcppArmadillo into an R package to add high-performance C++ code. It handles setup, writing C++ functions, generating RcppExports, testing compiled code, and debugging. Use it when R functions are too slow, you need to interface with existing C/C++ libraries, or when implementing algorithms (loops, recursion, linear algebra) that benefit from compiled code.
快速安装
Claude Code
推荐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-integration在 Claude Code 中复制并粘贴此命令以安装该技能
技能文档
name: add-rcpp-integration description: > Rcpp- oder RcppArmadillo-Integration zu einem R-Paket fuer hochperformanten C++-Code hinzufuegen. Behandelt Einrichtung, Schreiben von C++-Funktionen, RcppExports-Generierung, Tests fuer kompilierten Code und Debugging. Verwenden, wenn eine R-Funktion zu langsam ist und Profiling einen Engpass bestaetigt, wenn eine Schnittstelle zu bestehenden C/C++-Bibliotheken benoetigt wird, oder beim Implementieren von Algorithmen (Schleifen, Rekursion, lineare Algebra), die von kompiliertem Code profitieren. locale: de source_locale: en source_commit: 6f65f316 translator: claude-opus-4-6 translation_date: 2026-03-16 license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: r-packages complexity: advanced language: R tags: r, rcpp, cpp, performance, compiled-code
Rcpp-Integration hinzufuegen
C++-Code mit Rcpp fuer leistungskritische Operationen in ein R-Paket integrieren.
Wann verwenden
- R-Funktion ist zu langsam und Profiling bestaetigt einen Engpass
- Schnittstelle zu bestehenden C/C++-Bibliotheken wird benoetigt
- Algorithmen implementieren, die von kompiliertem Code profitieren (Schleifen, Rekursion)
- RcppArmadillo fuer lineare Algebra-Operationen hinzufuegen
Eingaben
- Erforderlich: Bestehendes R-Paket
- Erforderlich: Zu ersetzende oder zu ergaenzende R-Funktion durch C++
- Optional: Externe C++-Bibliothek fuer die Schnittstelle
- Optional: Ob RcppArmadillo verwendet werden soll (Standard: einfaches Rcpp)
Vorgehensweise
Schritt 1: Rcpp-Infrastruktur einrichten
usethis::use_rcpp()
Dies:
- Erstellt
src/-Verzeichnis - Fuegt
Rcppzu LinkingTo und Imports in DESCRIPTION hinzu - Erstellt
R/packagename-package.Rmit@useDynLibund@importFrom Rcpp sourceCpp - Aktualisiert
.gitignorefuer kompilierte Dateien
Fuer RcppArmadillo:
usethis::use_rcpp_armadillo()
Erwartet: src/-Verzeichnis erstellt, DESCRIPTION mit Rcpp in LinkingTo und Imports aktualisiert, und R/packagename-package.R enthaelt @useDynLib-Direktive.
Bei Fehler: Wenn usethis::use_rcpp() fehlschlaegt, manuell src/ erstellen, LinkingTo: Rcpp und Imports: Rcpp zu DESCRIPTION hinzufuegen und #' @useDynLib packagename, .registration = TRUE sowie #' @importFrom Rcpp sourceCpp zur Paket-Level-Dokumentationsdatei hinzufuegen.
Schritt 2: C++-Funktion schreiben
src/my_function.cpp erstellen:
#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;
}
Fuer 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;
}
Erwartet: C++-Quelldatei existiert unter src/my_function.cpp mit gueltiger // [[Rcpp::export]]-Annotation und Roxygen-artigen //'-Dokumentationskommentaren.
Bei Fehler: Pruefen, ob die Datei #include <Rcpp.h> (oder <RcppArmadillo.h> fuer Armadillo) verwendet, dass die Export-Annotation in einer eigenen Zeile direkt oberhalb der Funktionssignatur steht und die Rueckgabetypen auf gueltige Rcpp-Typen abgebildet sind.
Schritt 3: RcppExports generieren
Rcpp::compileAttributes()
devtools::document()
Erwartet: R/RcppExports.R und src/RcppExports.cpp automatisch generiert.
Bei Fehler: Auf C++-Syntaxfehler pruefen. Sicherstellen, dass das // [[Rcpp::export]]-Tag oberhalb jeder exportierten Funktion vorhanden ist.
Schritt 4: Kompilierung verifizieren
devtools::load_all()
Erwartet: Paket kompiliert und wird ohne Fehler geladen.
Bei Fehler: Compiler-Ausgabe auf Fehler pruefen. Haeufige Probleme:
- Fehlende System-Header: Entwicklungsbibliotheken installieren
- Syntaxfehler: C++-Compiler-Meldungen zeigen auf die Zeile
- Fehlendes
Rcpp::depends-Attribut fuer RcppArmadillo
Schritt 5: Tests fuer kompilierten Code schreiben
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_))
})
Erwartet: Tests bestehen und bestaetigen, dass die C++-Funktion identische Ergebnisse wie das R-Aequivalent liefert und Grenzfaelle (leere Vektoren, NA-Werte) korrekt behandelt.
Bei Fehler: Wenn Tests bei der NA-Behandlung fehlschlagen, explizite NA-Pruefungen im C++-Code mit NumericVector::is_na() hinzufuegen. Wenn Tests bei leerer Eingabe fehlschlagen, am Anfang der Funktion eine Schutzklausel fuer Vektoren der Laenge Null hinzufuegen.
Schritt 6: Bereinigungsskript hinzufuegen
src/Makevars erstellen:
PKG_CXXFLAGS = -O2
cleanup im Paketstammverzeichnis erstellen (fuer CRAN):
#!/bin/sh
rm -f src/*.o src/*.so src/*.dll
Ausfuehrbar machen: chmod +x cleanup
Erwartet: src/Makevars setzt Compiler-Flags und das cleanup-Skript entfernt kompilierte Objekte. Beide Dateien existieren auf Paketstamm-Ebene.
Bei Fehler: Pruefen, ob cleanup Ausfuehrungs-Berechtigungen hat (chmod +x cleanup) und dass Makevars Tabs (keine Leerzeichen) fuer Einrueckungen verwendet, wenn Makefile-Regeln hinzugefuegt werden.
Schritt 7: .Rbuildignore aktualisieren
Sicherstellen, dass kompilierte Artefakte korrekt behandelt werden:
^src/.*\.o$
^src/.*\.so$
^src/.*\.dll$
Erwartet: .Rbuildignore-Muster verhindern, dass kompilierte Objektdateien in das Paket-Tarball aufgenommen werden, waehrend Quelldateien und Makevars erhalten bleiben.
Bei Fehler: devtools::check() ausfuehren und nach Hinweisen zu unerwarteten Dateien in src/ suchen. .Rbuildignore-Muster anpassen, um nur .o-, .so- und .dll-Dateien auszuschliessen.
Validierung
-
devtools::load_all()kompiliert ohne Warnungen - Kompilierte Funktion liefert korrekte Ergebnisse
- Tests bestehen fuer Grenzfaelle (NA, leer, grosse Eingaben)
-
R CMD checkbesteht ohne Kompilierungswarnungen - RcppExports-Dateien sind generiert und eingecheckt
- Leistungsverbesserung mit Benchmarks bestaetigt
Haeufige Stolperfallen
compileAttributes()vergessen: RcppExports nach Aenderungen an C++-Dateien neu generieren- Integer-Ueberlauf:
doublestattintfuer grosse numerische Werte verwenden - Speicherverwaltung: Rcpp verwaltet Speicher fuer Rcpp-Typen automatisch; nicht manuell
deleteaufrufen - NA-Behandlung: C++ kennt Rs NA nicht. Mit
Rcpp::NumericVector::is_na()pruefen - Plattformportabilitaet: Plattformspezifische C++-Funktionen vermeiden. Auf Windows, macOS und Linux testen.
- Fehlendes
@useDynLib: Die Paket-Level-Dokumentation muss@useDynLib packagename, .registration = TRUEenthalten
Verwandte Skills
create-r-package- Paketeinrichtung vor dem Hinzufuegen von Rcppwrite-testthat-tests- kompilierte Funktionen testensetup-github-actions-ci- CI muss C++-Toolchain habensubmit-to-cran- kompilierte Pakete benoetigen zusaetzliche CRAN-Pruefungen
GitHub 仓库
相关推荐技能
evaluating-llms-harness
测试该Skill通过60+个学术基准测试(如MMLU、GSM8K等)评估大语言模型质量,适用于模型对比、学术研究及训练进度追踪。它支持HuggingFace、vLLM和API接口,被EleutherAI等行业领先机构广泛采用。开发者可通过简单命令行快速对模型进行多任务批量评估。
cloudflare-cron-triggers
测试这个Claude Skill提供了关于Cloudflare Cron Triggers的完整知识库,用于通过cron表达式定时执行Workers。它支持配置周期性任务、维护作业和自动化工作流,并能处理常见的cron触发错误。开发者可以用它来设置定时任务、测试cron处理器,并集成Workflows和Green Compute功能。
webapp-testing
测试该Skill为开发者提供了基于Playwright的本地Web应用测试工具集,支持自动化测试前端功能、调试UI行为、捕获屏幕截图和查看浏览器日志。它包含管理服务器生命周期的辅助脚本,可直接作为黑盒工具运行而无需阅读源码。适用于需要快速验证本地Web应用界面和交互功能的开发场景。
finishing-a-development-branch
测试这个Skill用于开发分支完成后的集成决策,当代码实现完成且测试通过时,它会引导开发者选择合适的工作流。它首先验证测试状态,然后提供合并、创建PR或清理等结构化选项。核心价值在于确保代码质量的同时,标准化分支收尾流程。
