首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rf_eval R的C语言中有可能捕获错误吗?

Rf_eval R的C语言中有可能捕获错误吗?
EN

Stack Overflow用户
提问于 2014-12-15 14:08:41
回答 1查看 334关注 0票数 6

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

一些样本函数

代码语言:javascript
复制
SEXP foo(SEXP x, SEXP env) {
   SEXP res;
   PROTECT(res = Rf_eval(x, env));
   UNPROTECT(1); 
   return res;
}

我尝试过来自RcppRcpp11RcppRcpp11,但它们都不适合我的情况,我需要直接给Rf_eval打电话。在C中可以直接捕获错误吗?如果是的话,怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-15 14:54:11

在R内在s.h中使用R_tryEval或R_tryEvalSilent

代码语言:javascript
复制
#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;
}

使用

代码语言:javascript
复制
> .Call("foo", quote(stop("oops")), .GlobalEnv)
Error: oops
error occurred
NULL

下面是一个更完整的示例,检索最后一个错误

代码语言:javascript
复制
#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;
}

用作

代码语言:javascript
复制
.Call("silent", quote(stop("oops")), .GlobalEnv, quote(geterrmessage()))

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27485899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档