MCP HubMCP Hub
스킬 목록으로 돌아가기

add-rcpp-integration

pjt222
업데이트됨 Yesterday
4 조회
17
2
17
GitHub에서 보기
기타general

정보

이 스킬은 고성능 C++ 코드를 위해 R 패키지에 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-almanac
Git 클론대체
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/add-rcpp-integration

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서


name: add-rcpp-integration description: > Añadir integración con Rcpp o RcppArmadillo a un paquete R para código C++ de alto rendimiento. Cubre la configuración, la escritura de funciones C++, la generación de RcppExports, las pruebas del código compilado y la depuración. Usar cuando una función R es demasiado lenta y la elaboración de perfiles confirma un cuello de botella, cuando se necesita interactuar con bibliotecas C/C++ existentes, o al implementar algoritmos (bucles, recursión, álgebra lineal) que se benefician del código compilado. locale: es 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

Añadir Integración con Rcpp

Integrar código C++ en un paquete R usando Rcpp para operaciones críticas de rendimiento.

Cuándo Usar

  • La función R es demasiado lenta y la elaboración de perfiles confirma un cuello de botella
  • Se necesita interactuar con bibliotecas C/C++ existentes
  • Implementar algoritmos que se benefician del código compilado (bucles, recursión)
  • Añadir RcppArmadillo para operaciones de álgebra lineal

Entradas

  • Obligatorio: Paquete R existente
  • Obligatorio: Función R a reemplazar o complementar con C++
  • Opcional: Biblioteca C++ externa con la que interactuar
  • Opcional: Si usar RcppArmadillo (predeterminado: Rcpp simple)

Procedimiento

Paso 1: Configurar la Infraestructura de Rcpp

usethis::use_rcpp()

Esto:

  • Crea el directorio src/
  • Añade Rcpp a LinkingTo e Imports en DESCRIPTION
  • Crea R/packagename-package.R con @useDynLib y @importFrom Rcpp sourceCpp
  • Actualiza .gitignore para los archivos compilados

Para RcppArmadillo:

usethis::use_rcpp_armadillo()

Esperado: Directorio src/ creado, DESCRIPTION actualizado con Rcpp en LinkingTo e Imports, y R/packagename-package.R contiene la directiva @useDynLib.

En caso de fallo: Si usethis::use_rcpp() falla, crear manualmente src/, añadir LinkingTo: Rcpp e Imports: Rcpp a DESCRIPTION, y añadir #' @useDynLib packagename, .registration = TRUE y #' @importFrom Rcpp sourceCpp al archivo de documentación a nivel de paquete.

Paso 2: Escribir la Función C++

Crear 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;
}

Para 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;
}

Esperado: Archivo fuente C++ en src/my_function.cpp con anotación // [[Rcpp::export]] válida y comentarios de documentación estilo roxygen //'.

En caso de fallo: Verificar que el archivo usa #include <Rcpp.h> (o <RcppArmadillo.h> para Armadillo), que la anotación de exportación está en su propia línea directamente encima de la firma de la función, y que los tipos de retorno se corresponden con tipos válidos de Rcpp.

Paso 3: Generar RcppExports

Rcpp::compileAttributes()
devtools::document()

Esperado: R/RcppExports.R y src/RcppExports.cpp generados automáticamente.

En caso de fallo: Revisar los errores de sintaxis C++. Asegurarse de que la etiqueta // [[Rcpp::export]] está presente encima de cada función exportada.

Paso 4: Verificar la Compilación

devtools::load_all()

Esperado: El paquete compila y carga sin errores.

En caso de fallo: Revisar la salida del compilador para detectar errores. Problemas frecuentes:

  • Cabeceras de sistema faltantes: Instalar las bibliotecas de desarrollo
  • Errores de sintaxis: Los mensajes del compilador C++ apuntan a la línea
  • Falta el atributo Rcpp::depends para RcppArmadillo

Paso 5: Escribir Pruebas para el Código Compilado

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_))
})

Esperado: Las pruebas pasan, confirmando que la función C++ produce resultados idénticos al equivalente R y gestiona los casos límite (vectores vacíos, valores NA) correctamente.

En caso de fallo: Si las pruebas fallan con la gestión de NA, añadir comprobaciones explícitas de NA en el código C++ usando NumericVector::is_na(). Si las pruebas fallan con entrada vacía, añadir una cláusula de guarda para vectores de longitud cero al inicio de la función.

Paso 6: Añadir Script de Limpieza

Crear src/Makevars:

PKG_CXXFLAGS = -O2

Crear cleanup en la raíz del paquete (para CRAN):

#!/bin/sh
rm -f src/*.o src/*.so src/*.dll

Hacer ejecutable: chmod +x cleanup

Esperado: src/Makevars establece los indicadores del compilador y el script cleanup elimina los objetos compilados. Ambos archivos existen en el nivel raíz del paquete.

En caso de fallo: Verificar que cleanup tiene permisos de ejecución (chmod +x cleanup) y que Makevars usa tabulaciones (no espacios) para la sangría si se añaden reglas estilo Makefile.

Paso 7: Actualizar .Rbuildignore

Asegurarse de que los artefactos compilados se gestionan correctamente:

^src/.*\.o$
^src/.*\.so$
^src/.*\.dll$

Esperado: Los patrones de .Rbuildignore evitan que los archivos objeto compilados se incluyan en el tarball del paquete, preservando los archivos fuente y Makevars.

En caso de fallo: Ejecutar devtools::check() y buscar NOTEs sobre archivos inesperados en src/. Ajustar los patrones de .Rbuildignore para excluir solo los archivos .o, .so y .dll.

Validación

  • devtools::load_all() compila sin advertencias
  • La función compilada produce resultados correctos
  • Las pruebas pasan para casos límite (NA, vacío, entradas grandes)
  • R CMD check pasa sin advertencias de compilación
  • Los archivos RcppExports están generados y confirmados
  • La mejora de rendimiento se confirma con benchmarks

Errores Comunes

  • Olvidar compileAttributes(): Hay que regenerar RcppExports tras modificar archivos C++
  • Desbordamiento de enteros: Usar double en lugar de int para valores numéricos grandes
  • Gestión de memoria: Rcpp gestiona la memoria automáticamente para los tipos Rcpp; no usar delete manualmente
  • Gestión de NA: C++ no conoce los NA de R. Comprobar con Rcpp::NumericVector::is_na()
  • Portabilidad entre plataformas: Evitar características C++ específicas de una plataforma. Probar en Windows, macOS y Linux.
  • Falta @useDynLib: La documentación a nivel de paquete debe incluir @useDynLib packagename, .registration = TRUE

Habilidades Relacionadas

  • create-r-package - configuración del paquete antes de añadir Rcpp
  • write-testthat-tests - probar las funciones compiladas
  • setup-github-actions-ci - CI debe tener la cadena de herramientas C++
  • submit-to-cran - los paquetes compilados necesitan verificaciones adicionales de CRAN

GitHub 저장소

pjt222/agent-almanac
경로: i18n/es/skills/add-rcpp-integration
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

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개 이상의 독립적인 문제를 동시에 조사하고 해결하기 위해 다중 에이전트를 배치합니다. 공유 상태나 의존성 없이 해결 가능한 무관련 장애 시나리오에 맞게 설계되었습니다. 핵심 기능은 병렬 문제 해결로, 각 독립 문제 영역마다 하나의 에이전트를 할당하여 효율성을 극대화합니다.

스킬 보기