我是R世界的新手,我在使用gWidgets时遇到了一些困难,我希望那里有人可以帮助我。首先,我的R版本是2.15.2。我正在使用Windows 7 32位。
我想创建一个带输入/输出和选择(是,否)的GUI,所以如果用户选择(使用gradio)“是”,将显示一组额外的参数,如果“否”,那么应该消失(那些参数),或者是灰色的。最后,如果用户单击“确定”按钮,则它将传递一些将使用(稍后)调用另一个函数的参数。 以下是我的问题:
非常感谢您的所有帮助
塞萨尔
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))
答案 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脚本取决于我的选择。
非常感谢 ç