[R-SIG-Mac] Mac OS X tcltk/X11 issues

Marc Schwartz marc_schwartz at me.com
Tue Jul 15 00:13:38 CEST 2014


On Jul 14, 2014, at 4:53 PM, Marc Schwartz <marc_schwartz at me.com> wrote:

> On Jul 14, 2014, at 4:13 PM, John Fox <jfox at mcmaster.ca> wrote:
> 
>> Dear Simon and list members,
>> 
>> As many of you are aware, when X11 isn't installed on Mac OS X, loading the
>> tcltk package produces an error, with a message that many users find
>> cryptic. There was yet another instance of this problem reported to the list
>> today.
>> 
>> I'm interested in the issue because the Rcmdr package uses tcltk and thus
>> fails to load when X11 is absent. Rcmdr users tend to be inexperienced and
>> so, unless they find their way to the Rcmdr installation webpage, where
>> detailed installation instructions are provided, they tend to be stymied by
>> the problem.
>> 
>> If I could, I'd intercept the problem by checking capabilities()["X11"] in
>> the Rcmdr .onLoad() or .onAttach() function, but because the Rcmdr package
>> imports the tcltk namespace, the error occurs before these startup functions
>> are executed -- a chicken-and-egg problem.
>> 
>> It occurs to me that tcltk could fail more gracefully on Mac OS X when X11
>> is absent, perhaps popping up a webpage in a browser with instructions and a
>> link for installing XQuartz. I'd do this myself in the Rcmdr package if I
>> could. Or tcltk could check for the presence of X11 and not try to start it
>> if it's absent, reporting a warning rather than throwing an error.
>> 
>> Alternatively, I'd be grateful if someone could suggest how I might detect
>> the problem in the Rcmdr package before loading fails. The only thing that I
>> could think of was writing a separate RcmdrInstall package that bypasses
>> tcltk, but that would be awkward and would only help users who discovered
>> that RcmdrInstall exists.
>> 
>> Thanks,
>> John
> 
> 
> John,
> 
> Is there someplace in your startup process where you could run code along the lines of:
> 
> if (grepl("apple", R.version$platform) & length(list.files("/opt/X11/bin", pattern = "Xquartz")) == 0) {
>     cat("X11 is required. Please visit http://xquartz.macosforge.org to download and install Xquartz.")
>     stop()
> }
> 
> 
> The above code will check to see if the user is running R on OS X and also if the Xquartz binary is present in the default location.
> 
> Not sure if this is helpful.


A possible correction in the above code relative to detecting OS X:

if ((Sys.info()["sysname"] == "Darwin") & length(list.files("/opt/X11/bin", pattern = "Xquartz")) == 0) {
    cat("X11 is required. Please visit http://xquartz.macosforge.org to download and install Xquartz.")
    stop()
}


I believe that Sys.info()["sysname"] == "Darwin" is preferred for detecting the OS that R is running on versus the OS that it was built upon according to the help files, if I read correctly. This could be important if someone is building R from source versus installing Simon's CRAN binary, I presume.

Regards,

Marc



More information about the R-SIG-Mac mailing list