Re: [R] tcl/tk return problem

From: Duncan Murdoch <>
Date: Wed 31 Aug 2005 - 22:36:56 EST

Prof Brian Ripley wrote:
> On Wed, 31 Aug 2005, Philippe Grosjean wrote:

>>deggle wrote:
>>>I'm very new in working with tcl/tk in R and have a problem which will
>>>sound silly to most of you.
>>>Here is the code I have problems with:
>>>readcelfiles <- function()
>>>   require(tcltk)
>>>   tt <- tktoplevel()
>>>   tkgrid(tklabel(tt,text="Choose a directory!"))
>>> OnOK <- function()
>>> {
>>>    fileDir<-tclvalue(tkchooseDirectory())
>>>    data.raw <- ReadAffy(celfile.path=fileDir)
>>>    #return(data.raw)
>>> }
>>>   OK.but <- tkbutton(tt,text="OK",command=OnOK)
>>>   tkgrid(OK.but)
>>>   tkfocus(tt)
>>>So after clicking on my "OK" button, I choose my directory and read the
>>>But now I want to return the object to my workspace ... "return" doesn't
>>>work here.
>>I suppose you mean in the User Workspace. Your OnOK function should look
>>like that:
>>OnOK <- function() {
>>      fileDir<-tclvalue(tkchooseDirectory())
>>      data.raw <<- ReadAffy(celfile.path=fileDir)
>>Note that the function overwrites any existing 'data.raw', so this could
>>be dangerous. Writting directly in the User Workspace is not advised
>>from inside a function, but here, it is the simplest way to return a
>>result from a tk widget action.

> Maybe simplest, but not a very good way. See
> R_SOURCES/src/library/tcltk/R/utils.R for ideas on how to write a modal
> dialog box that returns the value selected.
> One problem with <<- is that it does not necessarily write in the
> workspace. You need
> assign("data.raw", ReadAffy(celfile.path=fileDir), envir=.GlobalEnv)
> to be sure of that. (The example code I quote does use <<- but in a
> controlled way.)

This works, and you weren't suggesting it as a good style, but I'd like to say it's really a bad style to write to .GlobalEnv. The controlled use of <<- as in tk_select.list from the file you quoted is really the best way to solve this problem. As a general rule, you shouldn't stomp on something you don't own, and functions don't own variables in .GlobalEnv.

What tk_select.list does is define OnOK locally, and use <<- to write to the tk_select.list environment. Then the result can be manipulated and returned politely, without stomping on anything anywhere.

Duncan Murdoch mailing list PLEASE do read the posting guide! Received on Wed Aug 31 22:47:49 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:40:00 EST