Rf_error和Rf_warning定义

Lau*_*ent 3 r

我在哪里可以找到这两个函数的定义.Grepping为他们的名字只带来声明,但我在源代码中找不到他们的实现.

Bro*_*ieG 7

大概你正在寻找C代码函数定义.我在寻找定义时通常会做的是在所有文件中搜索函数名称而不Rf_使用返回类型.例如,Rf_error我会搜索void error.在这种情况下,你很快就会得到(来自src/main/errors.c@758,对于R版本3.2.2):

void error(const char *format, ...)
{
    char buf[BUFSIZE];
    RCNTXT *c = R_GlobalContext;

    va_list(ap);
    va_start(ap, format);
    Rvsnprintf(buf, min(BUFSIZE, R_WarnLength), format, ap);
    va_end(ap);
    /* This can be called before R_GlobalContext is defined, so... */
    /* If profiling is on, this can be a CTXT_BUILTIN */
    if (c && (c->callflag & CTXT_BUILTIN)) c = c->nextcontext;
    errorcall(c ? c->call : R_NilValue, "%s", buf);
}
Run Code Online (Sandbox Code Playgroud)

Rf_warning 在同一文件的第262行定义.


Jos*_*ich 6

请注意以下行src/include/R_ext/Error.h

#ifndef R_NO_REMAP
#define error Rf_error
#define warning Rf_warning
#endif
Run Code Online (Sandbox Code Playgroud)

R_NO_REMAP通常未定义,因此这意味着宏error扩展为Rf_error. 因此,在包含 的文件中Error.h, 的实例将被预处理器error替换。Rf_error

因此,您需要搜索具有相同返回类型和参数的函数。正如 BrodieG 在他的回答中指出的那样,这些函数通常(总是?)具有相同的名称,但没有前缀Rf_

感谢邓肯·默多克的有用指点。任何错误都是我的。