add-rcpp-integration
정보
이 스킬은 R 패키지에 고성능 C++ 코드를 추가하기 위해 Rcpp 또는 RcppArmadillo를 통합합니다. 설정, 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-integrationClaude 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 Skill은 리소스 적정화, 태깅 전략, 지출 분석을 통해 개발자들이 클라우드 비용을 최적화할 수 있도록 지원합니다. AWS, Azure, GCP에서 클라우드 비용을 절감하고 비용 거버넌스를 구현하기 위한 프레임워크를 제공합니다. 인프라 비용을 분석하거나, 리소스를 적정화하거나, 예산 제약을 충족해야 할 때 사용하세요.
quantizing-models-bitsandbytes
기타이 스킬은 bitsandbytes를 사용하여 LLM을 8비트 또는 4비트 정밀도로 양자화하며, 최소한의 정확도 손실로 50-75%의 메모리 감소를 달성합니다. 제한된 GPU 메모리에서 더 큰 모델을 실행하거나 추론을 가속화하는 데 이상적이며, INT8, NF4, FP4와 같은 형식을 지원합니다. 이 스킬은 HuggingFace Transformers와 통합되어 QLoRA 학습 및 8비트 옵티마이저를 가능하게 합니다.
dispatching-parallel-agents
기타이 Claude Skill은 3개 이상의 독립적인 문제를 동시에 조사하고 해결하기 위해 다중 에이전트를 배치합니다. 공유 상태나 의존성 없이 해결 가능한 무관련 장애 시나리오에 맞게 설계되었습니다. 핵심 기능은 병렬 문제 해결로, 각 독립 문제 영역마다 하나의 에이전트를 할당하여 효율성을 극대화합니다.
