返回技能列表

add-rcpp-integration

pjt222
更新于 2 days ago
2 次查看
17
2
17
在 GitHub 上查看
其他general

关于

This skill integrates Rcpp or RcppArmadillo into R packages to add high-performance C++ code. It handles setup, writing C++ functions, generating RcppExports, testing, and debugging. Use it when profiling reveals slow R functions, you need to interface with existing C/C++ libraries, or when implementing algorithms where compiled code excels (loops, recursion, linear algebra).

快速安装

Claude Code

推荐
主要方式
npx skills add pjt222/agent-almanac -a claude-code
插件命令备选方式
/plugin add https://github.com/pjt222/agent-almanac
Git 克隆备选方式
git 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: RcppImports: 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.Rsrc/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 仓库

pjt222/agent-almanac
路径: i18n/ja/skills/add-rcpp-integration
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

llamaguard

其他

LlamaGuard是Meta推出的7-8B参数内容审核模型,专门用于过滤LLM的输入和输出内容。它能检测六大安全风险类别(暴力/仇恨、性内容、武器、违禁品、自残、犯罪计划),准确率达94-95%。开发者可通过HuggingFace、vLLM或Sagemaker快速部署,并能与NeMo Guardrails集成实现自动化安全防护。

查看技能

cost-optimization

其他

这个Claude Skill帮助开发者优化云成本,通过资源调整、标记策略和预留实例来降低AWS、Azure和GCP的开支。它适用于减少云支出、分析基础设施成本或实施成本治理策略的场景。关键功能包括提供成本可视化、资源规模调整指导和定价模型优化建议。

查看技能

quantizing-models-bitsandbytes

其他

这个Skill使用bitsandbytes库量化大语言模型,能在GPU内存有限时通过8位或4位量化减少50-75%内存占用,同时保持精度损失最小。它支持INT8、NF4、FP4等多种量化格式,可与HuggingFace Transformers无缝集成,适用于需要部署更大模型或加速推理的场景。还提供QLoRA训练和8位优化器支持,让开发者能轻松实现高效模型压缩。

查看技能

dispatching-parallel-agents

其他

该Skill用于并行处理3个以上无依赖关系的独立故障,可为每个问题域分派专属Claude代理同时执行调查修复。它通过并发处理多个独立问题显著提升故障排查效率,特别适用于测试文件、子系统等无共享状态的场景。

查看技能