Re: [R] tcl/tk return problem

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

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

>>deggle wrote:
>>
>>>Hello,
>>>
>>>I'm very new in working with tcl/tk in R and have a problem which will
>>>probably
>>>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
>>>cel-files.
>>>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



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html 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