我是RGtk2和GUI编程的新手,所以我希望我的问题不是一件容易的事。
我正在尝试创建一个GUI,我想在其中导入某种.RData并使用它们,最后返回一些图。由于我想要导入的数据集可能会不时更改,我决定在菜单栏和工具栏中添加一个函数LOAD,它会重现命令&#34 ;负载" R. 加载工作区后,我添加了一些检查按钮以确定要使用的数据集和 remove-function ,它可以删除对象继承自先前加载的.RData文件。
以下是两个回调的代码:
# Number of companies & maximum number of companies
numb_comp <- 0
max_length <- 30
# Table Check for Companies
list_check <- vector('list', length=max_length)
### Implementing the callbacks
open_cb <- function(widget, window){
dialog <- gtkFileChooserDialog("Load a WorkSpace", window, "open",
"gtk-cancel", GtkResponseType["cancel"], "gtk-open",
GtkResponseType["accept"])
want_to_load <- FALSE
if (dialog$run() == GtkResponseType["accept"])want_to_load <- TRUE
if (!want_to_load) dialog$destroy()
else {
load(dialog$getFilename(),.GlobalEnv)
eval.parent(substitute(numb_comp <- length(names)))
table_col <- 6
table_row <- ceiling(numb_comp/table_col)
table_check <- gtkTable(rows=table_row,columns=table_col,homogeneous=TRUE)
l_check <- vector('list',length=numb_comp)
for (i in 1:length(names)){
button <- gtkCheckButton(names[i])
table_check$attach(button, (i-1)%% table_col, ((i-1)%% table_col) + 1,
floor((i-1)/table_col), floor((i-1)/table_col)+1)
l_check[[i]] <- button
rm(button)
}
frame_check$add(table_check)
eval.parent(substitute(list_check <- l_check))
statusbar$push(info, paste(" WorkSpace", basename(dialog$getFilename()),
"loaded!",sep=" "))
}
dialog$destroy()
}
remove_cb <- function(widget, window){
dialog <- gtkMessageDialog(main_win,"destroy-with-parent", "question", "yes-no",
"Do you really want to remove the WorkSpace?")
want_to_remove <- FALSE
if (dialog$run() == GtkResponseType["yes"])want_to_remove <- TRUE
if (!want_to_remove) dialog$destroy()
else {
eval.parent(substitute(numb_comp <- 0))
frame_check$remove(table_check)
table_col <- 6
table_row <- ceiling(numb_comp/table_col)
table_check <- gtkTable(rows=table_row,columns=table_col,homogeneous=TRUE)
for (i in 1:length(names)){
rien <- gtkLabel("a")
table_check$attach(rien, (i-1)%% table_col, ((i-1)%% table_col) + 1,
floor((i-1)/table_col), floor((i-1)/table_col)+1)
}
frame_check$add(table_check)
rm(list=c("files","ICDatasetRel","names","shortnames"),inherits=TRUE)
eval.parent(substitute(list_check <- vector('list',length=0)))
statusbar$push(info, " Workshop removed.")
}
dialog$destroy()
}
这是我尝试删除使用函数 open_cp 时创建的表。但是我看到它不起作用。
因此,我有两个问题:
由于检查按钮是在一个函数中创建的,我决定使用一种&#34;通过引用调用&#34; (当 open_cb 例程死亡时,请参阅 eval.parent(substitute(list_check&lt; -l_check)))来控制它们。这是个好主意吗?或者有更好的解决方案吗?我需要知道哪些按钮被激活以决定应该考虑哪个数据集。
使用我称之为 remove_cb 的函数,我将销毁LOAD操作带来的所有对象,但我还要更改&#34;物理方面&#34;的GUI。换句话说,我想清除实际的帧或用一个重叠的帧(没有按钮)替换它。可能吗?如果是,怎么做?
非常感谢任何帮助。