library(qtbase) library(qtutils) wtop <- Qt $ QWidget() ltop <- Qt $ QGridLayout() wtop $ setLayout(ltop) wtop$setWindowTitle("Kernel Density Estimation") dval <- Qt$QLineEdit("set.seed(23245); rnorm(4)") ltop $ addWidget(Qt $ QLabel("Data"), 0, 0) ltop $ addWidget(dval, 0, 1) hval <- Qt $ QDoubleSpinBox() hval $ setRange(0.01, 100) hval $ setSingleStep(0.01) ltop $ addWidget(Qt $ QLabel("Bandwidth"), 0, 2) ltop $ addWidget(hval, 0, 3) kerns <- eval(formals(density.default)$kernel) kval <- Qt$QComboBox() for (k in kerns) kval$addItem(k) ltop $ addWidget(Qt $ QLabel("Kernel"), 0, 4) ltop $ addWidget(kval, 0, 5) plotw <- QT(width = 10, height = 7) ltop $ addWidget(plotw, 1, 0, 1, 8) button <- Qt$QPushButton("&Update") ltop $ addWidget(button, 0, 7) space <- Qt$QSpacerItem(1, 1, Qt$QSizePolicy$MinimumExpanding) ltop $ addItem(space, 0, 6) showComp <- Qt$QCheckBox("&Show Components") ltop $ addWidget(showComp, 1, 0, 1, 1, Qt$Qt$AlignLeft | Qt$Qt$AlignTop) wtop plotError <- function(msg) { plot(0, 0, type="n", axes = FALSE, xlab = "", ylab = "") text(0, 0, msg, cex = 1) } plotDensity <- function(...) { e <- try(parse(text = dval$text), silent = TRUE) if (inherits(e, "try-error")) { plotError(sprintf("Invalid expression:\n %s", dval$text)) return() } x <- try(eval(e), silent = TRUE) if (inherits(x, "try-error")) { plotError(substring(as.character(x), 1, 10)) return() } if (!is.numeric(x)) return() plot(density(x, bw = hval$value, kern = kval$currentText), lwd = 2) ## points(x, rep(0, length(x)), col = "grey", pch = 16) rug(x) if (showComp$isChecked()) { for (xx in x) { d <- density(xx, bw = hval$value, kern = kval$currentText) d$y <- d$y / length(x) lines(d, col = "#FF000088") } } invisible() } plotDensity() qconnect(button, signal = "clicked", handler = plotDensity) qconnect(dval, signal = "textChanged", handler = plotDensity) qconnect(hval, signal = "valueChanged", handler = plotDensity) qconnect(kval, signal = "currentIndexChanged", handler = plotDensity) 1 ## wtop$setStyleSheet("font-size: 20pt") ## Alternative to QComboBox ## qsetClass("TextSpinBox", Qt$QSpinBox) ## qsetMethod("textFromValue", TextSpinBox, ## FUN = function(i) { ## c("gaussian", ## "epanechnikov", ## "rectangular", ## "triangular", ## "biweight", ## "cosine", ## "optcosine")[i+1L] ## }, access = "protected")