Zurück zu Fähigkeiten

add-rcpp-integration

pjt222
Aktualisiert 2 days ago
7 Ansichten
17
2
17
Auf GitHub ansehen
Anderegeneral

Über

Diese Fähigkeit integriert Rcpp oder RcppArmadillo in R-Pakete, um hochleistungsfähigen C++-Code hinzuzufügen. Sie übernimmt das Setup, das Schreiben von C++-Funktionen, das Generieren von RcppExports, das Testen und Debuggen. Verwenden Sie sie, wenn das Profiling langsame R-Funktionen aufzeigt, Sie mit bestehenden C/C++-Bibliotheken interagieren müssen oder wenn Sie Algorithmen implementieren, bei denen kompilierter Code glänzt (Schleifen, Rekursion, lineare Algebra).

Schnellinstallation

Claude Code

Empfohlen
Primär
npx skills add pjt222/agent-almanac -a claude-code
Plugin-BefehlAlternativ
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternativ
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/add-rcpp-integration

Kopieren Sie diesen Befehl und fügen Sie ihn in Claude Code ein, um diese Fähigkeit zu installieren

Dokumentation


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 Repository

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

Verwandte Skills

llamaguard

Andere

LlamaGuard ist Metas 7-8B-Parameter-Modell zur Moderation von LLM-Eingaben und -Ausgaben in sechs Sicherheitskategorien wie Gewalt und Hassrede. Es bietet eine Genauigkeit von 94-95 % und kann mit vLLM, Hugging Face oder Amazon SageMaker eingesetzt werden. Nutzen Sie diese Skill, um Inhaltsfilterung und Sicherheitsguardrails einfach in Ihre KI-Anwendungen zu integrieren.

Skill ansehen

cost-optimization

Andere

Diese Claude Skill unterstützt Entwickler bei der Optimierung von Cloud-Kosten durch Ressourcen-Dimensionierung, Tagging-Strategien und Ausgabenanalysen. Sie bietet einen Rahmen zur Senkung von Cloud-Ausgaben und zur Implementierung von Kosten-Governance für AWS, Azure und GCP. Nutzen Sie sie, wenn Sie Infrastrukturkosten analysieren, Ressourcen richtig dimensionieren oder Budgetvorgaben einhalten müssen.

Skill ansehen

quantizing-models-bitsandbytes

Andere

Diese Fähigkeit quantisiert LLMs auf 8-Bit- oder 4-Bit-Präzision mittels bitsandbytes und erreicht dabei eine Speicherreduzierung von 50–75 % bei minimalem Genauigkeitsverlust. Sie ist ideal für den Betrieb größerer Modelle mit begrenztem GPU-Speicher oder zur Beschleunigung von Inferenzvorgängen und unterstützt Formate wie INT8, NF4 und FP4. Die Fähigkeit integriert sich in HuggingFace Transformers und ermöglicht QLoRA-Training sowie 8-Bit-Optimierer.

Skill ansehen

dispatching-parallel-agents

Andere

Diese Claude-Fähigkeit verteilt mehrere Agenten, um drei oder mehr unabhängige Probleme gleichzeitig zu untersuchen und zu beheben. Sie ist für Szenarien konzipiert, die unabhängige Fehler umfassen, die ohne gemeinsamen Zustand oder Abhängigkeiten gelöst werden können. Die Kernfähigkeit ist die parallele Problemlösung, bei der pro unabhängigem Problembereich ein Agent zugewiesen wird, um die Effizienz zu maximieren.

Skill ansehen