R gWidgets删除参数并传递参数

时间:2013-02-18 21:58:49

标签: r gwidgets

我是R世界的新手,我在使用gWidgets时遇到了一些困难,我希望那里有人可以帮助我。首先,我的R版本是2.15.2。我正在使用Windows 7 32位。

我想创建一个带输入/输出和选择(是,否)的GUI,所以如果用户选择(使用gradio)“是”,将显示一组额外的参数,如果“否”,那么应该消失(那些参数),或者是灰色的。最后,如果用户单击“确定”按钮,则它将传递一些将使用(稍后)调用另一个函数的参数。 以下是我的问题:

  1. 你知道如何在用户选择“否”时删除参数,现在,如果我点击否,它会打印出我想要的内容,但当我再次点击“是”时,它会显示另外三个参数
  2. 您知道如何在用户点击“确定”时传递参数,这是为了以后点击“确定”时,它会在另一个r代码中调用(或获取)另一个函数
  3. 非常感谢您的所有帮助

    塞萨尔

    P.S。以下是我的代码:

    require(gWidgets)
    options("guiToolkit"="RGtk2")
    
    #options(expressions=500000)
    w <- gwindow("")
    g <- ggroup(horizontal = FALSE, container = w)
    
    glabel("Input/Output", container = g)
    inputFileDir <- gfilebrowse (text = "Select file...", type = "open", quote = FALSE,
                 filter = list("Text File" = list(patterns = c("*.txt"))), container = g)
    svalue(inputFileDir)
    
    outputFileDir <- gfilebrowse (text = "Input file name...", type = "save", quote = FALSE,
                                 filter = list("Text File" = list(patterns = c("*.txt"))), container = g)
    svalue(outputFileDir)
    
    glabel("Direction?", container = g)
    DirSelec <- c("Yes","No")
    rbF <- function(h,...){
      if (svalue(h$obj, index=TRUE) == 1){
        print ( "define handler here" )
    
        glabel("Meridional (Raster file):", container = g)
        fieldConstrainDir_v <- gedit("", container = g, default = 0)
        svalue(fieldConstrainDir_v)
    
        glabel("Zonal (Raster file):", container = g)
        fieldConstrainDir_u <- gedit("", container = g, default = 0)
        svalue(fieldConstrainDir_u)
    
        glabel("Max. Angle:", container = g)
        maxAng <- gedit("", width = 3, initial.msg = "Paste the path to the raster file (no extensions)", default = 0, container = g)
        svalue(maxAng)
      }else {
        #(svalue(h$obj, index=TRUE) == 2)
        print ( "When User click NO, it needs to go or gray out" )
      }
    }
    
    rb <- gradio(DirSelec, container = g)
    selected = svalue(rb, index=TRUE) <- 2
    rbH <- addHandlerClicked(rb, handler = rbF)
    
    bg <- ggroup(container = g)
    addSpring(bg)
    onOK <- function(h,...){
      print(svalue(inputFileDir))
      #chartr("\\", "/", print(svalue(inputFileDir)))
      print(svalue(outputFileDir))
      print(svalue(fieldConstrainDir_v))
      print(svalue(fieldConstrainDir_u))
      print(svalue(maxAng))
    
    }
    
    gbutton("    OK    ", container = bg, handler = onOK)
    gbutton(" Cancel ", container=bg, handler = function(h,...) dispose(w))
    

2 个答案:

答案 0 :(得分:3)

您有多种选择:

  • 您可以将额外的参数放入gexpandgroup小部件中,并在此处调用可见的&lt; - 方法。这将切换显示它们。

  • 在gWidgetsRGtk2中,您可以在未连接到父容器的(子)容器中创建窗口小部件(构造函数中没有cont = ...),然后添加(父,子)以添加和删除(父,子)删除。这不应该删除rm意义上的小部件,只需从屏幕上删除它们

  • 您可以将额外参数放入容器中并调用启用&lt; - 使用FALSE将其“灰化”出来。

前两个可能需要一些屏幕尺寸管理。

在所有情况下,子程序控件在程序中仍然可以设置和读取,因此您应该在那里使用默认值或在使用时进行一些检查。

对于传递参数,R中的一个好方法是将控件小部件放入列表中,比如说l。然后这个成语

out <- sapply(l, svalue)

将它们捆绑到可以传递给您的函数的列表中。 do.call函数使列表作为参数变得容易。

答案 1 :(得分:0)

以下是代码:

require(gWidgets)
w <- gwindow("") 
g <- ggroup(cont = w, horizontal = FALSE) 
g1 <- ggroup(cont = w) 
Vl <- list () 

fr3 <- gframe ("", cont=g, horizontal=FALSE) 
l3 <- glayout ( cont = fr3 , expand=TRUE) 
l3 [1,1] <- NbS <- glabel("Type", cont = l3) 
l3 [1,2] <- (Vl$NbS <- gcombobox (c("Dis","IDis","K"), cont = l3)) 

fr4 <- gframe ("", cont=g, horizontal=FALSE) 
l4 <- glayout (cont=fr4, expand = TRUE) 
l4 [1,1] <- Dm <- glabel("Dist", cont = l4) 
l4 [1,2] <- (Vl$Dm <- gedit("0", cont = l4))

rbC <- function (h,...){ 
  out <- lapply(Vl, svalue) 
  print(out) 
  if (out$NbS == "Dis") {
    print("Dis") 
    print(out$Dm) 
    # Dm <- get(out$Dm, get(svalue(Dm))) 
    # Dm <- get(out$Dm) 
    # dsrc <- source(".../Dis.r") 
    # print (do.call (dsrc, out)) 
    } else if (out$NbSelec == "IDis") {
      print("IDis") 
      }
  } 
ok <- gbutton("OK", cont = g1, handler=rbC) 

当我打印时,向我显示变量名称和值,我想要的是能够使用变量(与我的“Dis.r”中的名称相同)和do.call运行r脚本取决于我的选择。

非常感谢 ç