2013-03-26 2 views
1

Как работает muffleWarning в invokeRestart("muffleWarning")? Я спрашиваю, потому что в следующем коде:Функция автоматического перезапуска R, которая не прерывается

e <-expression({ 
    warning("Step 1",immediate.=TRUE) 
    warning("Step 2",immediate.=TRUE) 
}) 

r <- withRestarts(withCallingHandlers(eval(e) 
             ,warning=function(co){ 
             print(co) #1 
             invokeRestart("mymuffleWarn",co) 
             }) 
        , mymuffleWarn=function(co) print(conditionMessage(co))) 

я получаю выход (от # 1) для первого предупреждения. Однако, если я заменил mymufflewarn на muffleWarninginvokeRestart) все выходы print(co).

Благодаря

ответ

0

оглавлению исходный R код показывает это:

.signalSimpleWarning <- function(msg, call) 
    withRestarts({ 
      .Internal(.signalCondition(simpleWarning(msg, call), msg, call)) 
      .Internal(.dfltWarn(msg, call)) 
     }, muffleWarning = function() NULL) 

, который вызывается из

static void vsignalWarning(SEXP call, const char *format, va_list ap) 
{ 
    char buf[BUFSIZE]; 
    SEXP hooksym, hcall, qcall; 

    hooksym = install(".signalSimpleWarning"); 
    if (SYMVALUE(hooksym) != R_UnboundValue && 
     SYMVALUE(R_QuoteSymbol) != R_UnboundValue) { 
     PROTECT(qcall = LCONS(R_QuoteSymbol, LCONS(call, R_NilValue))); 
     PROTECT(hcall = LCONS(qcall, R_NilValue)); 
     Rvsnprintf(buf, BUFSIZE - 1, format, ap); 
     hcall = LCONS(mkString(buf), hcall); 
     PROTECT(hcall = LCONS(hooksym, hcall)); 
     eval(hcall, R_GlobalEnv); 
     UNPROTECT(3); 
    } 
    else vwarningcall_dflt(call, format, ap); 
} 

, который вызывается из

void warningcall(SEXP call, const char *format, ...) 
{ 
    va_list(ap); 
    va_start(ap, format); 
    vsignalWarning(call, format, ap); 
    va_end(ap); 
} 

Эта функция использовал к генерировать предупреждения в коде C, а также вызывается от do_warning, который является функцией C, которая поддерживает warning().

Таким образом, обработчик muffleWarning всегда доступен, когда возникает предупреждение.

Смежные вопросы