Dear all
I am trying to create several sliders, each in its own container and with
its own handler. It works fine when I create all the widgets manually, but
gives some strange behaviour when I pass everything through a loop.

## function to be used by the handler of the slider
count.mv.int <- function(x, start=1, end=2){
    assign("i", x, envir = .GlobalEnv)
    print(paste("i = ", i))
}
count.mv.int(2); i

## function to be used by the handler of the slider
count.mv.let <- function(x, start=1, end=4){
    assign("l", letters[x], envir = .GlobalEnv)
    print(paste("l = ", l))
}
count.mv.let(3); l

## manually created widgets
count.pop <- function(fun=c("count.mv.int", "count.mv.let")){
    require(gWidgets)
    options(guiToolkit="tcltk")
    w <- gwindow(paste("Counters"))
    g <- ggroup(cont=w, horizontal=T)
    g1 <- ggroup(cont=g, horizontal=FALSE)
    glabel(paste("'", fun[1], "'", sep=""), cont=g1)
    h1 <- function(h,...) eval(parse(text=paste(fun[1], "(svalue(h$obj))",
sep="")))
    s1 <- gslider(from=formals(fun[1])$start, to=formals(fun[1])$end,
            by=1, cont=g1, handler=h1)
    gseparator(horizontal=FALSE, cont=g, expand=TRUE)
    g2 <- ggroup(cont=g, horizontal=FALSE)
    glabel(paste("'", fun[2], "'", sep=""), cont=g2)
    h2 <- function(h,...) eval(parse(text=paste(fun[2], "(svalue(h$obj))",
sep="")))
    s2 <- gslider(from=formals(fun[2])$start, to=formals(fun[2])$end,
            by=1, cont=g2, handler=h2)
}
## works fine: each slider change will trigger the correct handler
count.pop()

## widgets created through loops
count.pop1 <- function(fun=c("count.mv.int", "count.mv.let")){
    require(gWidgets)
    options(guiToolkit="tcltk")
    w <- gwindow(paste("Counters (loop)"))
    g <- ggroup(cont=w, horizontal=T)
    for(k in 1:length(fun)){
        x.cont <- paste("g", i, sep="")
        assign(x.cont, ggroup(cont=g, horizontal=FALSE))
        glabel(paste("'", fun[k], "'", sep=""), cont=get(x.cont))
        x.handl <- paste("h", i, sep="")
        assign(x.handl, function(h,...) eval(parse(text=paste(fun[k],
"(svalue(h$obj))", sep=""))))
        x.sl <- paste("s", i, sep="")
        assign(x.sl, gslider(from=formals(fun[k])$start,
to=formals(fun[k])$end,
                by=1, cont=get(x.cont), handler=get(x.handl)))
        gseparator(horizontal=FALSE, cont=g, expand=TRUE)
    }
}
## wrong behaviour: both sliders will trigger the second handler only
count.pop1()

Could someone hint at what I am doing wrong? Thank you
Liviu

        [[alternative HTML version deleted]]

_______________________________________________
R-SIG-GUI mailing list
R-SIG-GUI@stat.math.ethz.ch
https://stat.ethz.ch/mailman/listinfo/r-sig-gui

Reply via email to