Attached a minor revision of the previous patch, to avoid NA_character_ prompt values from being printed as NA.
- Richard Bodewits On 09/16/2016 06:01 PM, Richard Bodewits wrote: > Hey all, new R user and first timer here. > > I've been using getGraphicsEvent() on an X11-Xlib device in a kind of > interactive loop, and would like to be able to stop it from printing > newlines in the console when I don't actually want to print a prompt. > Even an empty "" value still causes a newline right now. > > To not break any code that depends on this behavior, I figured getting > C_getGraphicsEvent to accept an NA value would be the way to go. It > strikes me as highly unlikely that there's any code out there built on > expecting getGraphicsEvent() to error out when getting a 'prompt = NA' > parameter, so this seems like a safe change to make. > > After rooting about in the R source for a bit I've found a way to > implement this change myself in src/main/gevents.c, and I've included a > patch as attachment. What I don't know is if there's a better or at > least more conventional way to be checking for the NA value. > > Coercing with asChar() and only comparing against R_NaString causes NULL > values, functions, expression objects and potentially others to become > valid prompt values as well, so I'm using TYPEOF() to restrict accepted > values further. I've found manually entered NA values are interpreted as > being of LGLSXP, so that's the only type I'm accepting NA values for. Is > there a better way? There's an isna() in library/utils/src/io.c, but > that module doesn't seem to be available to the linker in the current > build script for gevents.c's module, which would make it a more invasive > patch to use. I'm also not certain it'd work the way I'd want it to, > from looking at its internals. > > As far as I can tell, the prompt value is only used in two places; > do_getGraphicsEvent() in src/main/gevents.c, and GA_eventHelper() in > library/grDevices/src/devWindows.c. The latter has a sanity check for > string-ness already, so making NA a possibility should be safe there, as > well. > > That apparent lack of use elsewhere leads me to a question about the > help file for getGraphicsEvent(). In it, the claim is made that 'prompt' > is used to display a prompt text on the device. This might be true in MS > Windows, but for X11 the prompt value seems to be solely used for > Rprintf() to the console. Is this discrepency a bug or missing feature > in the X11 implementation, an incorrect wording in the help, or an > interpretation error on my side? Whatever it is, I've also included a > minor patch for the help file to at least indicate support for 'prompt = > NA'. > > Apologies if I'm doing this all wrong, or if I'm missing obvious reasons > why these patches are unacceptable. As I said, first timer here and new > to R in general. ;-) > > > - Richard Bodewits > > > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >
Index: src/main/gevents.c =================================================================== --- src/main/gevents.c (revision 71298) +++ src/main/gevents.c (working copy) @@ -135,7 +135,7 @@ checkArity(op, args); prompt = CAR(args); - if (!isString(prompt) || !length(prompt)) error(_("invalid prompt")); + if ((!isString(prompt) || !length(prompt)) && (TYPEOF(prompt) != LGLSXP || asChar(prompt) != R_NaString)) error(_("invalid prompt")); /* NB: cleanup of event handlers must be done by driver in onExit handler */ @@ -159,8 +159,10 @@ if (!count) error(_("no graphics event handlers set")); - Rprintf("%s\n", CHAR(asChar(prompt))); - R_FlushConsole(); + if (asChar(prompt) != R_NaString) { + Rprintf("%s\n", CHAR(asChar(prompt))); + R_FlushConsole(); + } /* Poll them */ while (result == R_NilValue) {
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel