是否有可能赶上用C错误Rf_eval R' [英] Is it possible to catch error in C for Rf_eval R?
本文介绍了是否有可能赶上用C错误Rf_eval R'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要赶上 Rf_eval
错误的 C
。是,即使可能吗?
I need to catch an error in Rf_eval
in C
. Is that even possible?
一些示例功能
SEXP foo(SEXP x, SEXP env) {
SEXP res;
PROTECT(res = Rf_eval(x, env));
UNPROTECT(1);
return res;
}
我曾尝试 Rcpp_eval
从 RCPP
和 Rcpp11
,但他们都没有为我的情况下工作,我需要 Rf_eval
直接调用。是否有可能直接捕获错误使用C?如果是的话怎么样?
I have tried Rcpp_eval
from Rcpp
and Rcpp11
, but both of them don't work for my case, I need to call Rf_eval
directly. Is it possible to catch an error directly in C? If so how?
推荐答案
使用R_tryEval或R_tryEvalSilent在Rinternals.h
use R_tryEval or R_tryEvalSilent in Rinternals.h
#include <Rdefines.h>
SEXP foo(SEXP fun, SEXP env)
{
int err = 0;
R_tryEval(fun, env, &err);
if (err)
Rprintf("error occurred\n");
return R_NilValue;
}
与
> .Call("foo", quote(stop("oops")), .GlobalEnv)
Error: oops
error occurred
NULL
这里有一个小更完整的例子,检索的最后一个错误
Here's a little more complete example, retrieving the last error
#include <Rdefines.h>
SEXP silent(SEXP fun, SEXP env, SEXP errmsg)
{
int err = 0;
SEXP result = PROTECT(R_tryEvalSilent(fun, env, &err));
if (err) {
SEXP msg = PROTECT(R_tryEvalSilent(errmsg, env, &err));
if (!err)
Rprintf("error occurred: %s",
CHAR(STRING_ELT(msg, 0)));
else
Rprintf("(unknown) error occurred");
UNPROTECT(1);
result = R_NilValue;
}
UNPROTECT(1);
return result;
}
作为
.Call("silent", quote(stop("oops")), .GlobalEnv, quote(geterrmessage()))
也许它使一个很大的意义留下尽可能多的code作为可能的(例如,有条件的错误处理)在R平面,无论是通过包装进行评估的功能或提供,而不是一个自定义错误处理功能 geterrmessage()
。
这篇关于是否有可能赶上用C错误Rf_eval R'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文