'da bir R uyarısı nasıl üretilir? Yığında C++ destructor'lar üzerinde bir longjmp içerdiğinden Rcpp'de Rf_error()
numaralı çağrıdan kaçınılması gerektiğini biliyoruz. Bu yüzden, C++ istisnalarını Rcpp koduna atmayı tercih ediyoruz (throw Rcpp::exception("...")
veya stop("...")
işlevi aracılığıyla). Ancak, R uyarıları Rf_error()
numaralı çağrıya neden olabilir (bu davranış warn
seçeneğine bağlıdır). Yani, Rf_warning()
numaralı telefona yapılan bir çağrı da riskli.Rcpp
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
Yıkıcıya çağrılmadığını görüyoruz ("son" mesajı yok).
C++ - yıkıcı dostu bir şekilde bir R uyarısı nasıl oluşturulur? Doğru davranış warn>2
eğer verir
// [[Rcpp::export]]
void test() {
Test t;
Function warning("warning");
warning("test"); // here R errors are caught and transformed to C++ exceptions
}
:
start
end
Error in eval(expr, envir, enclos) : (converted from warning) test
kimsenin daha iyi olup olmadığını merak Rcpp gelen R'ın warning
işlevini çağırarak kapsar ile çözümlerin
Bunun iyi olması gerektiğini düşünüyorum - sadece statik nesnelere dikkat edin. –