在R包中使用C++执行头

问题描述 投票:0回答:2

我正在开发一个包含C++代码的R包,我想使用标准库头“执行”。由于 C++17 现在是 CRAN 上的默认值,这似乎没问题。然而,这个头文件尚未在 Apple Clang 中实现,并且从 R for macOS Developer 网站可以看出,macOS 上的 R 包中的 C++ 代码将使用 Apple 的工具链进行编译。

因此,我的问题是:假设我有一个类似于下面的函数,并行计算集合差。这会导致 CRAN 上的 macOS 包构建失败吗?

#include <RcppArmadillo.h>
#include <execution>
using namespace arma;

// [[Rcpp::export]]
vec setdiff(const vec& x, const vec& y) {
  vec xs = sort(x);
  vec ys = sort(y);

  std::vector<double> diff;
  std::set_difference(
    std::execution::par,
    xs.begin(), xs.end(), ys.begin(), ys.end(),
    std::inserter(diff, diff.begin()));

  return conv_to<vec>::from(diff);
}

/*** R
setdiff(1:10, 3)
*/


在我自己的 M1 Mac 上,我可以通过将以下行添加到

~/.R/Makevars
来进行编译,从而确保我使用 g++ 而不是 Apply clang。

CXX=/opt/homebrew/bin/g++-13
CXX17=/opt/homebrew/bin/g++-13
r rcpp cran rcpparmadillo
2个回答
0
投票

我尝试了类似于@SymbolixAU 在评论中建议的内容。

我创建了一个名为

anRpackage
的包,其中包含以下文件:

  • DESCRIPTION
Package: anRpackage
Type: Package
Title: What the package does (short line)
Version: 1.0
Date: 2024-01-09
Author: Who wrote it
Maintainer: Who to complain to <[email protected]>
Description: More about what it does (maybe more than one line). One more 
  sentence.
License: GPL-3
Imports: Rcpp
LinkingTo: Rcpp, RcppArmadillo
RoxygenNote: 7.2.3
Encoding: UTF-8
  • src/setdiff.cpp
#include "RcppArmadillo.h"
#include <execution>
using namespace arma;

// [[Rcpp::depends(RcppArmadillo)]]


// [[Rcpp::export]]
arma::vec setdiff_par(const arma::vec& x, const arma::vec& y) {
  vec xs = sort(x);
  vec ys = sort(y);
  
  std::vector<double> diff;
  std::set_difference(
    std::execution::par,
    xs.begin(), xs.end(), ys.begin(), ys.end(),
    std::inserter(diff, diff.begin()));
  
  return conv_to<vec>::from(diff);
}
  • src/Makevars
    src/Makevars.win
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
  • 包含自动生成的
    R
    RcppExports.R
    目录。

提交给win-builder,

devtools::check_win_devel()
,成功了。相反,提交到 R Mac Builder,构建失败了。


0
投票

您遇到了问题特定的编译器和 C++17 的实现,这与 C++17“本身”的问题不同。

编写 R 扩展 IIRC 非常清楚“由编译器提供”。在这种情况下,您想要的 C++17 功能由最新的

g++
版本(包括 macOS)提供,但 不是 (由 CRAN macOS 维护者规定)
clang++
版本您在 macOS 上遇到。

在工具链更新之前,您无法在 macOS 的 CRAN 上使用此功能。

© www.soinside.com 2019 - 2024. All rights reserved.