Доступ к данным о `inst / extdata` из тестов Rcpp Catch - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь получить доступ к файлу данных в файле inst/extdata из теста Rcpp Catch2.Дерево файлов выглядит следующим образом:

├── 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?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы можете получить путь system.file(), вызвав функцию R из C ++, даже если это не экспортированная функция C ++ (именно так я интерпретировал ваш запрос после комментариев к посту и ответа Дирка Эддельбюттеля).Рассмотрим следующий код C ++ в print_extdata.cpp:

#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"
0 голосов
/ 25 октября 2018

Я добавляю это как другой ответ, так как я получил его только из ответов Дирка и Дюкмейра.

Я обнаружил, что пакет во время тестирования Rcpp еще не был загружен, и поэтомуОтвет Duckmayr не сработал из коробки.Однако после некоторой путаницы я обнаружил, что его код при вызове только с параметром package выведет текущий путь проекта, и поэтому я обнаружил, что в этот момент пакет будет загружен, однако с путем из проектарепозиторий.

Это действительно немного сбивает с толку, поскольку тесты, использующие R, работают с установочной папкой R должным образом (например, /home/user/R/x86_64-pc-linux-gnu-library/3.5/).Мне нужно копнуть глубже, чтобы понять, почему это так.

В конце концов, я пошел с этой функцией, чтобы иметь возможность получить путь в тестах:

#include <Rcpp.h>
#include <string>

std::string get_datapath_fromR(std::string filename, std::string packageName)
{
    Rcpp::Environment base("package:base");
    Rcpp::Function sys_file = base["system.file"];
    // "inst" field is necessary at this point
    Rcpp::StringVector file_path_sv = sys_file(
        "inst", "extdata", filename,
        Rcpp::_["package"] = packageName,
        Rcpp::_["mustWork"] = true
    );
    std::string file_path = Rcpp::as<std::string>(file_path_sv);
    return file_path;
}

И я могувызовите его в таком тесте:

...
std::string datafile = get_datapath_fromR("data-sample", "package");        
...

и получите в результате: /home/user/path/to/package/folder/packageName/inst/extdata/data-sample

0 голосов
/ 25 октября 2018

Не используйте жестко закодированный путь.Попробуйте попытаться выяснить, нужно ли вам

  • время сборки пакета , и тогда это будет ../inst/extdata/data-sample/foo.csv или

  • один раз установлен , в этом случае это стандарт system.file("extdata/foo.csv", package="yourpackage")

Это немного проблемно для пакетов R в целом - но даже когда вы делаете R CMD check на самом деле сначала устанавливает пакет , поэтому вы во втором случае.

Имеет смысл?

...