2013-05-30 10 views
5

Das ist wahrscheinlich so einfach, ich werde zusammenzucken, wenn die Antwort zurückkommt, aber ich bin völlig ratlos. Ich habe die Handbücher ausprobiert, habe versucht, das Internet zu durchsuchen, verschiedene Beispiele und alles, was mir einfällt. Ich bin immer noch fest.Erhalte Daten aus einer Tcltk-Funktion

Ich versuche, eine einfache Eingabe für den Benutzer zu erstellen, um zwei Werte hinzuzufügen, die ich dann im Rest des R-Skripts verwenden kann. Ich brauche das Skript, um zu pausieren und auf die Eingabe des Benutzers zu warten und dann weiterzumachen, sobald es die Eingabe erhalten hat (wie die Funktion zum Auswählen der Datei funktioniert). Nachdem ich eine Menge Sachen gelesen hatte, entschied ich mich für die Bibliothek (tcltk). Ich habe eine nette kleine Box innerhalb einer Funktion.

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) 

    } 

Wenn ich eintippe:

inputs() 

Der nette kleine Kasten angezeigt und ich kann meinen Wert Eingang, sage 3 und 4 für dieses Beispiel.

ich zurück

<Tcl> 
[1] 3 
[1] 4 

ich diese Nummer in einem späteren Teil des R-Code verwenden möchten. Wie bekomme ich sie, damit ich das Äquivalent davon bekommen kann?

input1 <- 3 
input2 <- 4 

Vielen Dank im Voraus für die Hilfe.

Antwort

7

Hier ist eine Änderung Ihrer Funktion:

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)) 
} 

nun die Funktion wie laufen:

myvals <- inputs() 

nun Ihre 2 Werte eingeben und auf "Senden" klicken, um die myvals Variable schauen dann, Es enthält Ihre 2 Werte.

+0

Oh perfekt! Mein Problem wurde behoben. DANKE!!! –

1

Sie haben sie im Senden Rückruf - Sie müssen sie nur irgendwo platzieren. Manchmal sind globale Variablen dafür am besten. Verwenden Sie einfach < < - um ihnen zuzuweisen, damit die Bindungen außerhalb des Bereichs des Senden-Rückrufs passieren. Sie können auch eine Umgebung für diesen Zweck oder sogar eine Referenzklasse verwenden.

+1

Oh ... können Sie das nur ein bisschen mehr erklären. Wie mache ich "Callback absenden" und wie verwende ich << - –

Verwandte Themen