add-rcpp-integration
について
このスキルは、RパッケージにRcppまたはRcppArmadilloを統合し、高性能なC++コードを追加します。セットアップ、C++関数の記述、RcppExportsの生成、テスト、デバッグを扱います。プロファイリングでR関数の遅延が判明した場合、既存のC/C++ライブラリとのインターフェースが必要な場合、またはコンパイル済みコードが優れるアルゴリズム(ループ、再帰、線形代数)を実装する場合に使用します。
クイックインストール
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: > 高性能C++コードのためにRcppまたはRcppArmadilloをRパッケージに統合する。 セットアップ、C++関数の記述、RcppExportsの生成、コンパイル済みコードのテスト、 デバッグを網羅。プロファイリングでボトルネックが確認されたR関数が遅すぎる場合、 既存のC/C++ライブラリとのインターフェースが必要な場合、またはコンパイル済みコードが 有利なアルゴリズム(ループ、再帰、線形代数)を実装する時に使用する。 locale: ja 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統合の追加
パフォーマンスが重要な処理にRcppを使用してRパッケージにC++コードを統合する。
使用タイミング
- プロファイリングでボトルネックが確認されたR関数が遅すぎる時
- 既存のC/C++ライブラリとのインターフェースが必要な時
- コンパイル済みコードが有利なアルゴリズムを実装する時(ループ、再帰)
- 線形代数演算にRcppArmadilloを追加する時
入力
- 必須: 既存のRパッケージ
- 必須: C++で置き換えるまたは補完するR関数
- 任意: インターフェースする外部C++ライブラリ
- 任意: RcppArmadilloを使用するかどうか(デフォルト:プレーンRcpp)
手順
ステップ1: Rcppインフラのセットアップ
usethis::use_rcpp()
これにより:
src/ディレクトリが作成される- DESCRIPTIONのLinkingToとImportsに
Rcppが追加される R/packagename-package.Rに@useDynLibと@importFrom Rcpp sourceCppが作成される- コンパイル済みファイル用に
.gitignoreが更新される
RcppArmadilloの場合:
usethis::use_rcpp_armadillo()
期待結果: src/ディレクトリが作成される。DESCRIPTIONのLinkingToとImportsにRcppが追加される。R/packagename-package.Rに@useDynLibディレクティブが含まれる。
失敗時: usethis::use_rcpp()が失敗する場合、手動でsrc/を作成し、DESCRIPTIONにLinkingTo: RcppとImports: Rcppを追加し、パッケージレベルのドキュメントファイルに#' @useDynLib packagename, .registration = TRUEと#' @importFrom Rcpp sourceCppを追加する。
ステップ2: C++関数の記述
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;
}
期待結果: src/my_function.cppに有効な// [[Rcpp::export]]アノテーションとroxygen形式の//'ドキュメントコメントを持つC++ソースファイルが存在する。
失敗時: ファイルが#include <Rcpp.h>(Armadilloの場合は<RcppArmadillo.h>)を使用していること、エクスポートアノテーションが関数シグネチャの直上の独立した行にあること、戻り値の型が有効なRcpp型にマップされることを確認する。
ステップ3: RcppExportsの生成
Rcpp::compileAttributes()
devtools::document()
期待結果: R/RcppExports.Rとsrc/RcppExports.cppが自動的に生成される。
失敗時: C++の構文エラーを確認する。エクスポートされる各関数の上に// [[Rcpp::export]]タグが存在することを確認する。
ステップ4: コンパイルの確認
devtools::load_all()
期待結果: パッケージがエラーなくコンパイルされて読み込まれる。
失敗時: コンパイラ出力のエラーを確認する。一般的な問題:
- システムヘッダの欠如:開発ライブラリをインストールする
- 構文エラー:C++コンパイラのメッセージが行を指示する
- RcppArmadilloの
Rcpp::depends属性の欠如
ステップ5: コンパイル済みコードのテスト
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_))
})
期待結果: テストがパスし、C++関数がR相当の結果と同一の結果を生成し、エッジケース(空のベクトル、NA値)を正しく処理することが確認される。
失敗時: NAの処理でテストが失敗する場合、C++コードでNumericVector::is_na()を使用した明示的なNAチェックを追加する。空の入力でテストが失敗する場合、関数の先頭にゼロ長ベクトルに対するガード条件を追加する。
ステップ6: クリーンアップスクリプトの追加
src/Makevarsを作成する:
PKG_CXXFLAGS = -O2
パッケージルートにcleanupを作成する(CRAN用):
#!/bin/sh
rm -f src/*.o src/*.so src/*.dll
実行可能にする:chmod +x cleanup
期待結果: src/Makevarsがコンパイラフラグを設定し、cleanupスクリプトがコンパイル済みオブジェクトを削除する。両ファイルがパッケージルートレベルに存在する。
失敗時: cleanupに実行権限があることを確認する(chmod +x cleanup)。Makefileスタイルのルールを追加する場合、Makevarsがインデントにスペースではなくタブを使用していることを確認する。
ステップ7: .Rbuildignoreの更新
コンパイル済みアーティファクトが処理されていることを確認する:
^src/.*\.o$
^src/.*\.so$
^src/.*\.dll$
期待結果: .Rbuildignoreパターンが、ソースファイルとMakevarsを保持しながら、パッケージtarballにコンパイル済みオブジェクトファイルが含まれないようにする。
失敗時: devtools::check()を実行してsrc/内の予期しないファイルに関するNOTEを確認する。.o、.so、.dllファイルのみを除外するように.Rbuildignoreパターンを調整する。
バリデーション
-
devtools::load_all()が警告なくコンパイルされる - コンパイル済み関数が正しい結果を生成する
- エッジケースのテストがパスする(NA、空の入力、大きな入力)
-
R CMD checkがコンパイル警告なしでパスする - RcppExportsファイルが生成されてコミットされている
- ベンチマークでパフォーマンス向上が確認される
よくある落とし穴
compileAttributes()の忘れ: C++ファイルを変更した後はRcppExportsを再生成しなければならない- 整数オーバーフロー: 大きな数値には
intではなくdoubleを使用する - メモリ管理: RcppはRcpp型のメモリを自動的に処理する;手動で
deleteしないこと - NAの処理: C++はRのNAを認識しない。
Rcpp::NumericVector::is_na()でチェックする - プラットフォームの移植性: プラットフォーム固有のC++機能を避ける。Windows、macOS、Linuxでテストする
@useDynLibの欠如: パッケージレベルのドキュメントには@useDynLib packagename, .registration = TRUEが必要
関連スキル
create-r-package- Rcpp追加前のパッケージセットアップwrite-testthat-tests- コンパイル済み関数のテストsetup-github-actions-ci- CIにはC++ツールチェーンが必要submit-to-cran- コンパイル済みパッケージはCRANの追加チェックが必要
GitHub リポジトリ
関連スキル
llamaguard
その他LlamaGuardは、暴力やヘイトスピーチなど6つの安全性カテゴリーにおいて、LLMの入力と出力をモデレートするMetaの70-80億パラメータモデルです。94〜95%の精度を提供し、vLLM、Hugging Face、Amazon SageMakerを使用してデプロイ可能です。このスキルを使用して、AIアプリケーションにコンテンツフィルタリングと安全策を簡単に統合できます。
cost-optimization
その他このClaudeスキルは、リソースの適正サイジング、タグ付け戦略、支出分析を通じて、開発者がクラウドコストを最適化することを支援します。AWS、Azure、GCPにわたるクラウド支出の削減とコストガバナンスの実施のためのフレームワークを提供します。インフラコストの分析、リソースの適正サイジング、または予算制約への対応が必要な際にご利用ください。
quantizing-models-bitsandbytes
その他このスキルは、bitsandbytesを使用してLLMを8ビットまたは4ビット精度に量子化し、精度の低下を最小限に抑えつつ50〜75%のメモリ削減を実現します。限られたGPUメモリでより大規模なモデルを実行したり、推論を高速化するのに理想的で、INT8、NF4、FP4などのフォーマットをサポートしています。HuggingFace Transformersと統合され、QLoRAトレーニングや8ビットオプティマイザーを可能にします。
dispatching-parallel-agents
その他このClaudeスキルは、複数のエージェントを配備し、3つ以上の独立した問題を並行して調査・修正します。共有状態や依存関係がなく解決可能な、無関係な障害が発生するシナリオ向けに設計されています。中核となる機能は並列問題解決であり、効率を最大化するために独立した問題領域ごとに1つのエージェントを割り当てます。
