c++ - 从 Rcpp Catch 测试访问 `inst/extdata` 上的数据

标签 c++ r rcpp testthat catch-unit-test

我正在尝试通过 Rcpp Catch2 测试访问 inst/extdata 文件中的数据文件。文件树如下所示:

├── inst
│   └── extdata
│       └── data-sample
├── R
│   ├── catch-routine-registration.R
│   └── RcppExports.R
├── src
    ├── mycode.cpp
    ├── RcppExports.cpp
    ├── Package_types.h
    ├── test-example.cpp
    └── test-runner.cpp

我相信,这与您使用 devtools 从新包框架中获得的内容类似。现在,我可以从测试中访问这个 data-sample 文件,就像这样很容易测试:

system.file(
    "extdata", "data-sample", package = "Package", mustWork = TRUE
)

并根据需要使用它。我知道此时使用已安装包的全局路径,但是我找不到将此值传递给我的 C++ 测试的方法。我目前使用的是硬编码路径,但这显然只适用于我的机器。

这是我目前使用的:

const std::string DATAFILE = "/my/package/inst/extdata/data-sample";

因为这是一个读取文件的函数,我真的不能以任何方式嵌入它,但我仍然想知道:如何将 R 数据传递给 Rcpp/Catch 测试?

提前致谢!

最佳答案

您可以通过从 C++ 调用 R 函数来获取 system.file() 路径,即使它不是导出的 C++ 函数(这就是我在帖子评论后解释您的查询的方式以及 Dirk Eddelbuettel 的回答)。考虑 print_extdata.cpp 中的以下 C++ 代码:

#include <Rcpp.h>

Rcpp::StringVector get_extdata(){
    Rcpp::Environment base("package:base");
    Rcpp::Function sys_file = base["system.file"];
    Rcpp::StringVector res = sys_file("extdata", "2012.csv",
                                      Rcpp::_["package"] = "testdat");
    return res;
}


// [[Rcpp::export]]
void print_extdata() {
    Rcpp::StringVector path = get_extdata();
    Rcpp::Rcout << path;
}

然后从 R 中调用:

> Rcpp::sourceCpp("print_extdata.cpp")
> print_extdata()
"/home/duckmayr/R/x86_64-pc-linux-gnu-library/3.5/testdat/extdata/2012.csv"

关于c++ - 从 Rcpp Catch 测试访问 `inst/extdata` 上的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52979101/

相关文章:

c++ - 从特定起始顶点 boost prim_minimum_spanning_tree

c++ - 在 Direct3D9 中启用抗锯齿(多采样渲染目标)

c++ - C++ 中逗号分隔的 float

c++ - Pthreads 将 void * 参数转换为 int 数组

r - 在 group_by 中,改变一个新列,根据列的出现顺序获取列的值

c++ - Rcpp - 用二进制函数转换 NumericVector?

rstudio - 安装R和RStudio RCurl、PKI等包出错

c++ - 更改 R 包的 exportPattern 以隐藏 Rcpp 函数

r - R 中的本福德定律

r - 如何在不使用 R 读取整个文件的情况下确定远程下载的文件大小