是否有可能赶上用C错误Rf_eval R' [英] Is it possible to catch error in C for Rf_eval R?

查看:223
本文介绍了是否有可能赶上用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆