From jfox at mcmaster.ca  Mon Nov  3 00:47:30 2003
From: jfox at mcmaster.ca (John Fox)
Date: Mon Nov  3 00:45:40 2003
Subject: [Rd] problem with fix() called from Rcmdr
Message-ID: <5.1.0.14.2.20031102182314.020ed018@127.0.0.1>

Dear list members,

I and my students have encountered an intermittent problem using the Rcmdr 
package (version 0.9-0) under Windows (with the SDI). The problem occurs 
both in versions 1.7.1 and 1.8.0 of R.

The problem seems to occur only in the following context: The "Edit data 
set" button is pressed in the Rcmdr GUI. This executes the fix() function 
on the active data frame, bringing up a data editor window. After changing 
variable names in the data editor, the editor is closed by the user. This 
causes the active data frame to be detached and re-attached. That is, this 
is what happens when things work normally. Frequently, however, Rgui.exe 
crashes at this point, reporting a "program error."

I suspect that there some kind of timing problem, but before I experiment 
further, I wonder whether anyone has any more specific ideas.

To be supply some more details, the "Edit data set" button executes the 
following code:

     onEdit <- function(){
         command <- paste("fix(", .activeDataSet, ")", sep="")
         logger(command)
         justDoIt(command)
         activeDataSet(.activeDataSet)
         tkwm.deiconify(.commander)
         tkfocus(.commander)
         }

where .activeDataSet is a (global) character variable containing the name 
of the "active" data frame, logger() just echoes the command to the R console

logger <- function(command){
     if (tclvalue(.logCommands) == "1") {
         tkinsert(.log, "end", paste(command,"\n", sep=""))
         tkyview.moveto(.log, 1)
         }
     lines <- strsplit(command, "\n")[[1]]
     for (line in lines) cat(paste("\nR-cmdr>", line, "\n"))
     command
     }


and JustDoIt() is defined as follows:

justDoIt <- function(command) {
     result <- try(eval(parse(text=command), envir=.GlobalEnv), silent=TRUE)
     if (class(result)[1] ==  "try-error"){
         tkmessageBox(message=paste("Error:",
             strsplit(result, ":")[[1]][2]), icon="error")
         tkfocus(.commander)
         return()
         }
     result
     }

The function activeDataSet() has the following definition (but I doubt that 
the problem is there, since Rcmdr uses this function a lot and I've not 
observed a problem in any other context):

activeDataSet <- function(dsname){
     if (missing(dsname)) {
         if (is.null(.activeDataSet)){
             tkmessageBox(message="There is no active data set.", 
icon="error", type="ok")
             return(FALSE)
             }
         else return(.activeDataSet)
         }
     if (!is.data.frame(get(dsname, envir=.GlobalEnv))){
         tkmessageBox(message=paste(dsname, " is not a data frame and 
cannot be attached.",
             sep=""), icon="error", type="ok")
         tkfocus(.commander)
         return()
         }
     if (!is.null(.activeDataSet) && (tclvalue(.attachDataSet) == "1")
         && (length(grep(.activeDataSet, search())) !=0)) {
         detach(pos = match(.activeDataSet, search()))
         logger(paste("detach(", .activeDataSet, ")", sep=""))
         }
     assign(".activeDataSet", dsname, envir=.GlobalEnv)
     assign(".variables", listVariables(), envir=.GlobalEnv)
     assign(".numeric", listNumeric(), envir=.GlobalEnv)
     assign(".factors", listFactors(), envir=.GlobalEnv)
     assign(".twoLevelFactors", listTwoLevelFactors(), envir=.GlobalEnv)
     tclvalue(.dataSetName) <- paste(.activeDataSet, " ")
     tkconfigure(.dataSetLabel, fg="blue")
     if (tclvalue(.attachDataSet) == "1"){
         attach(get(dsname, envir=.GlobalEnv), name=dsname)
         logger(paste("attach(", dsname, ")", sep=""))
         }
     dsname
     }

Any help would be greatly appreciated.

John
-----------------------------------------------------
John Fox
Department of Sociology
McMaster University
Hamilton, Ontario, Canada L8S 4M4
email: jfox@mcmaster.ca
phone: 905-525-9140x23604
web: www.socsci.mcmaster.ca/jfox


[Rd] problem with fix() called from Rcmdr
John Fox