Wir wissen, dass Aufruf in Rcpp Rf_error()
vermieden werden sollte, da es eine longjmp über C++ - Destruktoren auf dem Stapel enthält. Deshalb werfen wir C++ - Exceptions lieber in Rcpp-Code (wie throw Rcpp::exception("...")
oder über die stop("...")
-Funktion).So generieren Sie eine R-Warnung sicher in Rcpp
R-Warnungen können jedoch auch zu einem Aufruf von Rf_error()
führen (dieses Verhalten hängt von der Option warn
ab). So ist ein Anruf zu Rf_warning()
auch riskant.
Rcpp::sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;
class Test {
public:
Test() { Rcout << "start\\n"; }
~Test() { Rcout << "end\\n"; }
};
// [[Rcpp::export]]
void test() {
Test t;
Rf_warning("test");
}
')
options(warn=10)
test()
## start
## Error in test() : (converted from warning) test
Wir sehen, dass der Destruktor aufgerufen wurde nicht (es gibt keine „Ende“ -Meldung).
Wie generiert man eine R-Warnung in einer C++ - Destruktor-freundlichen Weise?
Ich denke, das sollte in Ordnung sein - seien Sie vorsichtig mit statischen Objekten. –