From r.bodewits at home.nl  Sun Sep 18 14:12:37 2016
From: r.bodewits at home.nl (Richard Bodewits)
Date: Sun, 18 Sep 2016 14:12:37 +0200
Subject: [Rd] getGraphicsEvent() questions, minor feature/tweak request,
 and patch(es).
In-Reply-To: <d9c233c6-c048-37b7-cb31-f39ae0499b1f@home.nl>
References: <d9c233c6-c048-37b7-cb31-f39ae0499b1f@home.nl>
Message-ID: <1b8d557e-3e21-0950-d3de-ab7ee5e3d064@home.nl>

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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
-------------- next part --------------
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) {


[Rd] getGraphicsEvent() questions, minor feature/tweak request, and patch(es).
Richard Bodewits