остановка в функции Rcpp (как часть пакета) завершается в режиме отладки - PullRequest
3 голосов
/ 06 мая 2019

Я тестирую использование stop в пакете с использованием Rcpp и вижу, что при использовании stop функция выходит в режим отладки в R. Например, я использую пример функции по ссылке (см. Также функцию takeLog3, также вставленную ниже)

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
double takeLog3(double val) {
    if (val <= 0.0) {           // log() not defined here
        stop("Inadmissible value");
    }
    return log(val);
}

Выход takeLog3(-10) равен

> takeLog3(-10)
Error in takeLog3(-10) : Inadmissible value
Called from: takeLog3(-10)
Browse[1]> 

и затем я должен ввести Q, чтобы выйти из режима отладки. Мой вопрос, это ожидаемое поведение? Во-вторых, как мне сделать оператор stop, чтобы не переходить в режим отладки, а полностью выйти из функции после отображения сообщения stop?

Обратите внимание, что я вижу это поведение, когда takeLog3 включен в пакет. Я не вижу такого поведения, когда у меня есть эта функция вне пакета в простом файле .cpp, где функция просто показывает сообщение stop и управление возвращается обратно в консоль, но НЕ переходит в режим отладки.

Любая помощь будет принята с благодарностью!

PS: Я только что обнаружил, что получаю нужное мне поведение, используя Rf_error вместо stop. Может ли кто-нибудь дать обоснованное мнение относительно того, какой из них предпочтительнее? Спасибо.

1 Ответ

4 голосов
/ 06 мая 2019

Второй вопрос: stop() вызывает Rf_error(), чтобы реализовать поведение, которое вы видите.

Первый вопрос: вы попали в отладчик, потому что IDE (которую вы не назвали или не упомянули) хочет быть полезным.Попробуйте это в командной строке в стандартной оболочке R:

R> Rcpp::cppFunction("bool myStop(std::string reason) { Rcpp::stop(reason); }")
R> myStop("tired")
Error in myStop("tired") : tired
R> 

Ubuntu 18.10, R 3.6.0.

...