使用gWidgets在R中加载和保存变量
在过去的几个月里,我一直在R中构建一个我希望打包的模拟。它由两个可用函数和许多内部函数组成,这些函数是两个可用函数中的一个在循环时调用的,用于执行模拟的各个阶段 一个简单的概念性示例是:使用gWidgets在R中加载和保存变量,r,user-interface,load,save,gwidgets,R,User Interface,Load,Save,Gwidgets,在过去的几个月里,我一直在R中构建一个我希望打包的模拟。它由两个可用函数和许多内部函数组成,这些函数是两个可用函数中的一个在循环时调用的,用于执行模拟的各个阶段 一个简单的概念性示例是: # Abstract representation 1st Usable function, generates object containing settings for simulation. settings <- function(){ matrix(c(1:4),nrow=2,ncol=2
# Abstract representation 1st Usable function, generates object containing settings for simulation.
settings <- function(){
matrix(c(1:4),nrow=2,ncol=2)
}
# Abstract representation of one of many internal functions, does some action in simulation.
int.func <- function(x){
out <- x*2
return(out)
}
# Abstract representation of second usable function, takes settings & invokes internal functions generates results & saves as R object files.
sim.func <- function(x){
ans <- int.func(x)
ans2 <- ans-2
save(ans2, file="outtest")
}
注意:以前的设置
功能现在在这个gui功能的第一行完成。
我将其添加到与上述三个函数相同的R文件中,将gui
作为导出添加到命名空间中,将gWidgets和gWidgetstcltk设置为导入,然后重新生成,然后我library()
包并执行gui()
界面出现了。但是,我有几个问题:
gui显示良好,但如果我单击按钮1(“编辑设置”)通过修复(输入)编辑设置,更改值,关闭编辑器,然后再次单击按钮查看更改是否已保留并存储在输入中,则这些更改没有保存。
读取对象也是如此,它不会覆盖函数gui()第一行中默认生成的输入对象
我认为这与函数环境有关,但我不太确定。在我的包的无gui版本中,用户生成包含设置的对象,该对象位于工作区中,并将其作为参数提供给模拟函数。然而,由于使用gui版本,所有内容都在函数gui()内运行,gWidgets处理程序使用函数(h,…),因此我不禁觉得环境是这里的问题。奇怪的是,当单击按钮1时,它会从gui()环境中找到输入,但不会在那里进行更改
有人能帮我解决这个问题,并建议我需要做什么吗
很抱歉问了这么长的问题,但我已经尽力解释清楚了。只要有库(gWidgets、gWidgetstcltk),代码是可复制的,这也是问题所在
复制和粘贴我在这里提供的代码,定义函数,然后运行gui()
。然后单击“编辑设置”按钮,更改单元格,退出,然后再次单击按钮以查看更改是否持续(它们没有)。我提供的抽象示例忠实地再现了我使用适当的模拟函数时遇到的相同问题,因此,如果我不能让它工作,我就不能让真实的东西工作
谢谢
本·W
UEA
塞恩斯伯里实验室
[编辑]以下是使用.GlobalEnv的修复/解决方法:
gui <- function(){
INPUT <- matrix(c(1:4),nrow=2,ncol=2)
.GlobalEnv$INPUT <- INPUT
mainwin <- gwindow("MainWindow")
button1 <- gbutton("Set", cont=mainwin, handler=
function(h,...){
INPUT <- .GlobalEnv$INPUT
fix(INPUT)
print("Settings have been edited...")
})
button2 <- gbutton("RUN", cont=mainwin, handler=
function(h,...){
sim.func(.GlobalEnv$INPUT)
print("The run is done")
})
writebutton <- gbutton("Write Settings to File",cont=mainwin, handler=
function(h,...){
setfilename <- ginput("Please enter the filename")
INPUT <- .GlobalEnv$INPUT
save(INPUT, file=setfilename)
})
loadutton <- gbutton("Load Settings from File", cont=mainwin,
handler=function(h,...){
fname <- gfile(test="Choose a file",
type="open",
action="print",
handler =
function(h,...){
do.call(h$action, list(h$file))
}
)
load(fname)
.GlobalEnv$INPUT <- INPUT})
}
gui我没有从软件包中运行它,但是它可以从命令行中正常运行。很可能是使用了fix
。它不分配给函数体中的变量INPUT
,而是分配给全局工作区中的INPUT
变量。你需要修理吗?您可以使用gdf
来实现这一点。您好,是的,我意识到它将输入放在全局工作区中,我刚刚实现了一项利用事实和.GlobalEnv$INPUT
的工作。我想,实际上,除非有技术上的理由不让函数使用.GlobalEnv,否则我可以这样做。因为可以使用的函数无论如何都会被导出,以允许不介意命令行的人以原始方式使用这些函数。使用全局环境似乎允许自由选择对某些事情使用GUI,对其他事情使用命令行。我已经在上面编辑了我的修复。我会尝试和gdf合作。
gui <- function(){
INPUT <- matrix(c(1:4),nrow=2,ncol=2)
mainwin <- gwindow("MainWindow")
button1 <- gbutton("Edit Settings", cont=mainwin, handler=
function(h,...){
fix(INPUT)
print("Settings Edited")
})
button2 <- gbutton("RUN", cont=mainwin, handler=
function(h,...){
sim.func(INPUT)
print("The run is done")
})
savebutton <- gbutton("Write Settings to File",cont=mainwin, handler=
function(h,...){
setfilename <- ginput("Please enter the filename")
save(INPUT, file=setfilename)
})
loadutton <- gbutton("Load Settings from File", cont=mainwin,
handler=function(h,...){
fname <- gfile(test="Choose a file",
type="open",
action="print",
handler =
function(h,...){
do.call(h$action, list(h$file))
}
)
load(fname)})
}
gui <- function(){
INPUT <- matrix(c(1:4),nrow=2,ncol=2)
.GlobalEnv$INPUT <- INPUT
mainwin <- gwindow("MainWindow")
button1 <- gbutton("Set", cont=mainwin, handler=
function(h,...){
INPUT <- .GlobalEnv$INPUT
fix(INPUT)
print("Settings have been edited...")
})
button2 <- gbutton("RUN", cont=mainwin, handler=
function(h,...){
sim.func(.GlobalEnv$INPUT)
print("The run is done")
})
writebutton <- gbutton("Write Settings to File",cont=mainwin, handler=
function(h,...){
setfilename <- ginput("Please enter the filename")
INPUT <- .GlobalEnv$INPUT
save(INPUT, file=setfilename)
})
loadutton <- gbutton("Load Settings from File", cont=mainwin,
handler=function(h,...){
fname <- gfile(test="Choose a file",
type="open",
action="print",
handler =
function(h,...){
do.call(h$action, list(h$file))
}
)
load(fname)
.GlobalEnv$INPUT <- INPUT})
}