On Apr 17, 2010, at 2:43 PM, baptiste auguie wrote: > Hi, > > On 17 April 2010 18:51, Simon Urbanek <simon.urba...@r-project.org> wrote: >> Baptiste, >> >> first, there is a mailing list specifically for Mac questions - R-SIG-Mac. >> > > I wasn't sure if it was Mac-specific (OK, quartz() is but I could not > test x11()). > >> Now to your post - grid.cap captures the screen of the device which has two >> implications here: >> >> a) Quartz is asynchronous -- i.e. is doesn't actually draw the content on >> screen until you're finished with drawing (for efficiency). Unfortunately R >> has no provision to tell the graphics device that it's done with drawing >> (you can always add another lines() etc.) so Quartz is simply guessing by >> measuring the time between draw commands. So when you run grid.cap while the >> output has not been drawn yet (i.e. immediately after the last drawing >> command) it will be empty as there is no content yet since Quartz is waiting >> for the end. > > OK, that makes sense. > >> >> b) it will contain the resize mark because it is a screen shot so the mark >> is actually part of it (this is intentional). > > This design decision surprises me. Would it be possible to have an > option not to capture this mark as well? >
I don't think so because the mark is part of the Quartz view - it is not something the device adds so it is not a "design decision". Again I can only repeat that if you want a re-play of the draw commands you should use that instead - it's a different task. >> >> If what you really want is a bitmap from the device, it's better to use >> quartz.save instead (followed by readPNG if you want the bitmap as raster) >> -- that actually re-runs the plot in a separate quartz device that is not >> on-screen so neither of the above are an issue. > > I thought the aim of grid.cap was to make it easier to capture a > bitmap copy (no need to create an external file). Is a screenshot more > useful? I didn't write grid.cap() so I don't know what the intention was, but "capturing a bitmap copy" is exactly the above (that is why it is called "capture" I suppose). What you are requesting is something different - creating a new bitmap using the same device settings and quartz.save does that. It would be trivial to add a parameter to quartz.save to return the bitmap directly instead of a file, but R did not have direct bitmap support so it was not requested so far. Cheers, Simon >> >> That said, you can file a) as a bug against Mac version of R (at >> https://bugs.r-project.org/ ) since grid.cap should actually trigger the >> flush before it does the capture. I cannot promise that the fix will make it >> to 2.11.0, though, because it may be non-trivial to trigger the asynchronous >> flush and wait for it without blocking something (I'll have to look). >> > > Will do. > > Thanks, > > baptiste > > >> Thanks, >> Simon >> >> >> On Apr 17, 2010, at 6:34 AM, baptiste auguie wrote: >> >>> Dear all, >>> >>> I am puzzled by the following behavior of the new grid.cap() function, >>> which appears to run out of time when capturing the output of a >>> graphic. It works fine if I introduce a Sys.sleep(1) before executing >>> more code, >>> >>> library(grid) >>> >>> quartz() >>> grid.circle(gp=gpar(fill="black")) >>> gg <- grid.cap() >>> dev.new() >>> grid.raster(gg) ## completely blank >>> gg[gg!="white"] ## indeed >>> >>> quartz() >>> grid.circle(gp=gpar(fill="black")) >>> Sys.sleep(1) >>> gg <- grid.cap() >>> dev.new() >>> grid.raster(gg) ## OK >>> gg[gg!="white"] >>> >>> I tried to see if the problem was limited to the quartz() device but >>> for some reason the x11() device is not working for me in this R >>> version, >>> >>> capabilities(what = NULL) >>> jpeg png tiff tcltk X11 aqua http/ftp >>> sockets libxml fifo cledit iconv NLS profmem cairo >>> TRUE TRUE TRUE TRUE FALSE TRUE TRUE >>> TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE >>> Warning message: >>> In doTryCatch(return(expr), name, parentenv, handler) : >>> unable to load shared library >>> '/Library/Frameworks/R.framework/Resources/modules/i386/R_X11.so': >>> dlopen(/Library/Frameworks/R.framework/Resources/modules/i386/R_X11.so, >>> 6): Library not loaded: /usr/X11/lib/libpng12.0.dylib >>> Referenced from: >>> /Library/Frameworks/R.framework/Resources/modules/i386/R_X11.so >>> Reason: Incompatible library version: R_X11.so requires version >>> 42.0.0 or later, but libpng12.0.dylib provides version 36.0.0 >>> >>> sessionInfo() >>> R version 2.11.0 RC (2010-04-16 r51754) >>> i386-apple-darwin9.8.0 >>> >>> locale: >>> [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 >>> >>> attached base packages: >>> [1] grid stats graphics grDevices utils datasets >>> methods base >>> >>> loaded via a namespace (and not attached): >>> [1] tools_2.11.0 >>> >>> I would appreciate if someone could confirm this behavior. Pointers to >>> a fix for the x11() device on my machine are also welcome! >>> >>> Best regards, >>> >>> baptiste >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >>> >> >> > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel