#include #include #define R_INTERFACE_PTRS 1 #include #include #include #include #include #include "embeddedRCall.h" /* simple helper function allows us to run plain strings. Ignore */ void eval_string(const char * command) { SEXP e, tmp; int hadError; ParseStatus status; PROTECT(tmp = NEW_CHARACTER(1)); SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(command)); e = PROTECT (R_ParseVector(tmp, 1, &status, R_NilValue)); R_tryEval(VECTOR_ELT(e,0), R_GlobalEnv, &hadError); Rf_PrintWarnings(); UNPROTECT(2); } void test_WriteConsole(char* buf, int buflen) { printf("\nClassified as regular output: "); printf("%s", buf); } void test_WriteErrConsole(char *buf, int buflen) { /* if (R_inError()) { if (R_inPrintWarnings()) { printf("\nClassified as additional warning after error: "); } else { printf("\nClassified as error output: "); } } else if (R_inWarning()) { printf("\nClassified as immediate warning: "); } else if (R_inPrintWarnings()) { printf("\nClassified as deferred warning: "); } else { printf("\nClassified as stderr message: "); } */ printf("\nClassified as stderr message: "); printf("%s", buf); } int main(int argc, char *argv[]) { init_R(argc, argv); ptr_R_WriteConsole = test_WriteConsole; ptr_R_WriteErrConsole = test_WriteErrConsole; R_Outputfile = NULL; R_Consolefile = NULL; // setup eval_string("library (stats)"); eval_string("options (warn=0)"); eval_string("print (\"regular output\")"); eval_string("warning (\"deferred warning\")"); eval_string("warning (\"immediate warning\", immediate.=TRUE)"); eval_string("stop (\"error output\")"); REprintf("direct call to REprintf\n"); // trying mixed output eval_string("x <- function () { print (\"regular output\"); warning (\"deferred warning\"); warning (\"immediate warning\", immediate.=TRUE); stop (\"error output\") }"); eval_string("x ()"); return(0); }