gpt4 book ai didi

r - 在 GUI 中使用 R 引用类将值从一个窗口传递到另一个窗口

转载 作者:行者123 更新时间:2023-12-04 20:10:53 25 4
gpt4 key购买 nike

我正在使用 gWidgets 在 R 中制作 GUI。到目前为止,我一直在通过全局环境将值从一个窗口传递到另一个窗口。使用全局环境实现起来很简单,但并不理想。一个问题是 R CMD check提示缺少全局变量的可见绑定(bind)。

作为这个问题的解决方案,一些 R 程序员已经提到了引用类。但是要了解引用类在这种情况下是如何工作的,举一个简单的例子真的很有帮助。

让我给一个愚蠢的 GUI 来使用。当用户点击第一个窗口的按钮时,它会将模型 m在全局环境中。第二个按钮获得 m来自全局环境并给出输出。当你再次点击第一个按钮时,它将创建一个新模型m并更改第二个按钮的输出。如果关闭第一个窗口,第二个窗口中的按钮仍然有效,因为 m是在全局环境中。

library(gWidgets)
options(guiToolkit = "tcltk")

h1 <- function(h, ...){
d1 <- data.frame(x=runif(10), y=runif(10))
.GlobalEnv$m <- lm(x ~ y, data=d1)
}

g1 <- gbutton("1. Make model",
container=gwindow(), handler=h1)

h2 <- function(h, ...){
d2 <- data.frame(y=(1:10)/10)
p <- predict(.GlobalEnv$m, newdata=d2)
print(p)
}

g2 <- gbutton("2. Make prediction",
container=gwindow(), handler=h2)

在此示例中如何使用引用类?

最佳答案

调用 setRefClass ,并将每个小部件和数据值包含为一个字段。小部件的类型应为 ANY .在 initialize 中初始化这些小部件方法,并将功能外包给其他方法。创建一个函数来包装类的创建。

silly_gui_generator <- setRefClass(
"SillyGui",
fields = list(
#widgets
win1 = "ANY",
win2 = "ANY",
button1 = "ANY",
button2 = "ANY",
#data
modelData = "data.frame",
predictionData = "data.frame",
model = "lm"
),
methods = list(
initialize = function(modelData = NULL)
{
if(is.null(modelData))
{
modelData <<- data.frame(x = runif(10), y = runif(10))
}

win1 <<- gwindow(visible = FALSE)
win2 <<- gwindow(visible = FALSE)
button1 <<- gbutton(
"1. Make model",
container = win1,
handler = function(h, ...)
{
makeModel()
}
)
button2 <<- gbutton(
"2. Make prediction",
container = win2,
handler = function(h, ...)
{
print(predictModel())
}
)
visible(win1) <- TRUE
visible(win2) <- TRUE
},
makeModel = function()
{
model <<- lm(x ~ y, data = modelData)
},
predictModel = function()
{
predictionData <<- data.frame(y = (1:10) / 10)
predict(model, newdata = predictionData)
}
)
)

generate_silly_gui <- function(modelData = NULL)
{
invisible(silly_gui_generator$new(modelData = modelData))
}

关于r - 在 GUI 中使用 R 引用类将值从一个窗口传递到另一个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17394954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com