Tôi đang tạo GUI bằng R bằng gWidgets. Cho đến bây giờ tôi đã truyền các giá trị từ cửa sổ này sang cửa sổ khác thông qua môi trường toàn cục. Sử dụng môi trường toàn cầu rất đơn giản để thực hiện nhưng không lý tưởng. Một vấn đề là R CMD check
phàn nàn về việc thiếu các ràng buộc có thể nhìn thấy đối với các biến toàn cầu.Sử dụng các lớp tham chiếu R để chuyển các giá trị từ cửa sổ này sang cửa sổ khác trong GUI
Là giải pháp cho vấn đề này, lớp tham chiếu đã được đề cập bởi một số lập trình viên R. Nhưng để hiểu các lớp tham chiếu sẽ hoạt động như thế nào trong ngữ cảnh này, nó sẽ thực sự giúp đỡ để có một ví dụ đơn giản.
Hãy để tôi cung cấp GUI giao diện ngớ ngẩn. Khi người dùng nhấn nút của cửa sổ đầu tiên, nó sẽ đặt mô hình m
trong môi trường toàn cầu. Nút thứ hai nhận được m
từ môi trường toàn cầu và cho đầu ra. Khi bạn nhấn nút đầu tiên một lần nữa, nó sẽ tạo ra một mô hình mới m
và thay đổi đầu ra của nút thứ hai. Nếu bạn đóng cửa sổ đầu tiên, nút trong cửa sổ thứ hai sẽ vẫn hoạt động, vì m
nằm trong môi trường toàn cục.
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)
Tôi làm cách nào để sử dụng các lớp tham chiếu trong ví dụ này?
Ví dụ tuyệt vời. Mã cho một cảnh báo: Trong .checkFieldsInMethod (def, fieldNames, allMethods): Phân bổ cục bộ cho tên trường sẽ không thay đổi trường: modelData <- data.frame (x = runif (10), y = runif (10)); hiển thị (win1) <- TRUE; hiển thị (win2) <- TRUE Ý của bạn là sử dụng "<< -"? (trong phương thức "khởi tạo" cho lớp "SillyGui") – JacobVanEtten
@JacobVanEtten Cảm ơn. Tôi đã sửa dòng 'modelData <-'. Các dòng <-' có thể nhìn thấy được nên được gán cục bộ. Quấn cuộc gọi đến 'setRefClass' trong' suppressWarnings' nếu nó làm phiền bạn. –
Cảm ơn! Mặc dù tôi sẽ theo gợi ý của John trước tiên, thật tuyệt khi có ví dụ này trực tuyến. – JacobVanEtten