Frage Holen Sie Daten aus einer tcltk-Funktion heraus


Das ist wahrscheinlich so einfach, dass ich zusammenzucken werde, 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.

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

Die nette kleine Box erscheint und ich kann meine Werte eingeben, sagen wir 3 und 4 für dieses Beispiel.

Ich komme zurück

<Tcl>  
[1] 3
[1] 4

Ich möchte diese Nummer in einem nachfolgenden Teil des R-Codes verwenden. Wie bekomme ich sie, damit ich das Äquivalent davon bekommen kann?

input1 <- 3
input2 <- 4

Vielen Dank im Voraus für die Hilfe.


5
2018-05-30 23:43


Ursprung


Antworten:


Hier ist eine Modifikation 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))
}

Führen Sie nun die Funktion wie folgt aus:

myvals <- inputs()

Geben Sie nun Ihre 2 Werte ein und klicken Sie auf "Submit", dann schauen Sie sich die myvals Variable, es enthält Ihre 2 Werte.


7
2018-05-31 00:15



Sie haben sie im Callback - senden Sie sie einfach irgendwo hin. Manchmal sind globale Variablen dafür am besten. Verwenden Sie einfach << -, um sie 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
2018-05-31 00:07