[R] tkbutton command - how to know which button was clicked?

Peter Dalgaard p.dalgaard at biostat.ku.dk
Fri Jun 30 22:24:48 CEST 2006


JeeBee <JeeBee at troefpunt.nl> writes:

> In the below code fragment, print(arg) always prints the
> last element of rekeningen$rekening.
> Is this because of lazy evaluation? I.e. arg is evaluated at
> the time the button is pressed?

No and yes. Lazy evaluation has nothing to do with it, but the
function passed to command= is not evaluated until the button is
pressed. If you want a different "arg" variable for each
button-function, you have to make sure that they have different
environments or have the arg actually part of the function.

There are various possible variations. One is

mk.button <- function(arg)
     tkgrid(tkbutton(frame.1,
       text=paste("Saldo historie", arg),
       command=function() print(arg)),
       sticky="news")

for .... {
    ....
    mk.button(arg)
}

another is to wrap a local({arg <- arg;.....}) around the tkgrid call
in your code. A 3rd one is

.....command=eval(substitute(function()print(arg)))...

> And, if so, how can I avoid this?
> I tried function() {force(arg); print(arg)} but that didn't work either.
> 
> Thanks,
> Jeebee.
> 
>   for(rek in seq(1,nrow(rekeningen))) {
>     arg <- rekeningen$rekening[rek]
> 
>     tkgrid(tkbutton(frame.1,
>       text=paste("Saldo historie", arg),
>       command=function() print(arg)),
>       sticky="news")
>   }

-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907



More information about the R-help mailing list