【问题标题】:Make C++ function (or variable) available to R and Rcpp functions使 C++ 函数(或变量)可用于 R 和 Rcpp 函数
【发布时间】:2016-09-15 21:35:52
【问题描述】:

我想使用这个函数(或者只是它返回的字符串):

const char* ERROR_TYPE() {
  return "unknown type detected for big.matrix object!";
}

在我的 R(cpp) 包中。

我想让我的所有 Rcpp 函数(src/ 中的文件)和我的所有测试(tests/testthat/ 中的 R 文件)都可以使用它。

换句话说,我想使用throw Rcpp::exception(MESSAGE); 和testthat::expect_error(foo(), MESSAGE),其中MESSAGE 被定义一次。

我尝试阅读和测试Rcpp Attributes 中所说的一些内容,但它似乎不适用于我的问题。


我尝试的第一件事是定义

// [[Rcpp::export]]
const char* ERROR_TYPE() {
  return "unknown type detected for big.matrix object!";
}

但它不适用于其他 Rcpp 文件。 然后,我尝试在其他 Rcpp 文件中使用 #include "myfile.cpp",但我有多个定义,即使尝试使用 inline 或 #ifndef #define #endif 但我认为这对于 C++ 文件来说很奇怪。 最后,我尝试使用inst/include/mypackage.h 并在那里定义我的函数或变量,但它似乎也不适用于其他 C++ 函数。

一个技巧似乎奏效了,定义一个 R 函数

ERROR_TYPE <- function() {
  "unknown type detected for big.matrix object!"
}

然后使用

Function err("ERROR_TYPE");
throw Rcpp::exception(as<const char*>(err()));

在您的 Rcpp 函数中。 不过,这似乎不是一个好习惯。 而且,它适用于 devtools::test(),但不适用于 devtools::check() 或 Travis-CI(找不到该函数),因此它也不是解决方案。

【问题讨论】:

标签: c++ r rcpp


【解决方案1】:
  • 使用inst/include/utils.h:

    #ifndef UTILS_H
    #define UTILS_H   
    
    const char* const ERROR_TYPE = "unknown type detected for big.matrix object!";
    
    #endif // UTILS_H
    
  • 在所有需要它的 Rcpp 文件中包含这个头文件

  • 创建一个返回此错误消息的 Rcpp 函数:

    #include <bigstatsr/utils.h>
    
    // [[Rcpp::export]]
    const char* const GET_ERROR_TYPE() {
      return ERROR_TYPE;
    }
    
  • 在 R 函数中使用 GET_ERROR_TYPE()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多