2013-05-30 21 views
5

Jest to prawdopodobnie tak proste, że będę się wzdrygał, gdy odpowiedź wróci, ale jestem całkowicie zaskoczony. Wypróbowałem podręczniki, próbowałem przeszukiwać sieć, różne przykłady i wszystko, co tylko wymyśliłem. Nadal jestem zablokowany.Pobierz dane z funkcji tcltk

Próbuję utworzyć proste wejście dla użytkownika, aby dodać dwie wartości, które mogę następnie wykorzystać w pozostałej części skryptu R. Potrzebuję skryptu, aby wstrzymać i czekać na dane wejściowe od użytkownika, a następnie kontynuować po otrzymaniu danych wejściowych (np. Jak działa funkcja wyboru pliku). Po przeczytaniu kilku rzeczy zdecydowałem się na bibliotekę (tcltk). Mam ładne małe pudełko w ramach funkcji.

inputs <- function(){ 

    xvar <- tclVar("") 
    yvar <- tclVar("") 

    tt <- tktoplevel() 
    tkwm.title(tt,"Input Numbers") 
    x.entry <- tkentry(tt, textvariable=xvar) 
    y.entry <- tkentry(tt, textvariable=yvar) 

    reset <- function() 
    { 
    tclvalue(xvar)<-"" 
    tclvalue(yvar)<-"" 
    } 

    reset.but <- tkbutton(tt, text="Reset", command=reset) 

    submit <- function() { 
    x <- as.numeric(tclvalue(xvar)) 
    y <- as.numeric(tclvalue(yvar)) 
    print(x) 
    print(y) 
    tkdestroy(tt) 
    } 
    submit.but <- tkbutton(tt, text="submit", command=submit) 

    tkgrid(tklabel(tt,text="Enter Two Inputs"),columnspan=2) 
    tkgrid(tklabel(tt,text="Input1"), x.entry, pady = 10, padx =10) 
    tkgrid(tklabel(tt,text="Input2"), y.entry, pady = 10, padx =10) 
    tkgrid(submit.but, reset.but) 

    } 

Kiedy wpisać:

inputs() 

Miły mały box wyskakuje i mogę wejść moje wartości, powiedzmy 3 i 4 dla tego przykładu.

wrócę

<Tcl> 
[1] 3 
[1] 4 

Chcę wykorzystać te liczby w dalszej części kodu R. Jak mogę je zdobyć, aby uzyskać ekwiwalent tego?

input1 <- 3 
input2 <- 4 

Z góry dziękuję za pomoc.

Odpowiedz

7

Tutaj jest modyfikacją swojej funkcji:

inputs <- function(){ 

    xvar <- tclVar("") 
    yvar <- tclVar("") 

    tt <- tktoplevel() 
    tkwm.title(tt,"Input Numbers") 
    x.entry <- tkentry(tt, textvariable=xvar) 
    y.entry <- tkentry(tt, textvariable=yvar) 

    reset <- function() 
    { 
    tclvalue(xvar)<-"" 
    tclvalue(yvar)<-"" 
    } 

    reset.but <- tkbutton(tt, text="Reset", command=reset) 

    submit <- function() { 
    x <- as.numeric(tclvalue(xvar)) 
    y <- as.numeric(tclvalue(yvar)) 
    e <- parent.env(environment()) 
    e$x <- x 
    e$y <- y 
    tkdestroy(tt) 
    } 
    submit.but <- tkbutton(tt, text="submit", command=submit) 

    tkgrid(tklabel(tt,text="Enter Two Inputs"),columnspan=2) 
    tkgrid(tklabel(tt,text="Input1"), x.entry, pady = 10, padx =10) 
    tkgrid(tklabel(tt,text="Input2"), y.entry, pady = 10, padx =10) 
    tkgrid(submit.but, reset.but) 

    tkwait.window(tt) 
    return(c(x,y)) 
} 

Teraz uruchom funkcję jak:

myvals <- inputs() 

teraz wpisać swoje wartości 2 i kliknij przycisk "Prześlij", a następnie spojrzeć na zmiennej myvals, zawiera twoje 2 wartości.

+0

Oh perfect! Naprawiono mój problem. DZIĘKUJĘ CI!!! –

1

Masz je w zgłoszeniu zwrotnym - po prostu musisz je gdzieś umieścić. Czasami najlepsze są dla tego zmienne globalne. Po prostu użyj < < - aby przypisać je tak, aby powiązania miały miejsce poza zakresem wywołania zwrotnego. Możesz również użyć środowiska do tego celu lub nawet klasy odniesienia.

+1

Och ... możesz wyjaśnić, że tylko odrobinę więcej. W jaki sposób mogę "przesłać oddzwonienie" i jak używać << - –

Powiązane problemy