c - 是否有可能在 C 中为 Rf_eval R 捕获错误?

标签 c r try-catch

我需要在 C 中捕获 Rf_eval 中的错误。这可能吗?

一些示例函数

SEXP foo(SEXP x, SEXP env) {
   SEXP res;
   PROTECT(res = Rf_eval(x, env));
   UNPROTECT(1); 
   return res;
}

我尝试了 RcppRcpp11 中的 Rcpp_eval,但它们都不适合我的情况,我需要调用 Rf_eval 直接。是否可以直接在 C 中捕获错误?如果是怎么办?

最佳答案

在 Rinternals.h 中使用 R_tryEval 或 R_tryEvalSilent

#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

这里有一个更完整的例子,检索最后一个错误

#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()))

在 R 级别保留尽可能多的代码(例如,条件错误处理)可能很有意义,方法是包装要评估的函数或提供自定义错误处理函数而不是 geterrmessage ()

关于c - 是否有可能在 C 中为 Rf_eval R 捕获错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27485899/

相关文章:

r - 自动转义unicode字符

r - Amazon Web Services - 如何每天运行一个脚本

r - 在 Rmarkdown 中打印 kable 元素列表

c# - try/catch 与 if/then/else - 特定案例

c++ - 嵌套 __try...__ except 子句,这是如何工作的?

CUDA __constant__ 对全局内存的尊重。哪个缓存?

c - 如何在C中正确操作字符串

java - 限制 try block 范围。有关系吗?

c - 跟随 C 中的指针

c++ - Autotools 提示使用不同上下文编译的文件