14 #include <Wt/WApplication> 16 #include <Wt/WContainerWidget> 17 #include <Wt/WLineEdit> 18 #include <Wt/WPushButton> 21 #include <Wt/WSpinBox> 22 #include <Wt/WGroupBox> 23 #include <Wt/WButtonGroup> 24 #include <Wt/WRadioButton> 25 #include <Wt/WHBoxLayout> 26 #include <Wt/WEnvironment> 27 #include <Wt/WFileResource> 42 WFileResource *imgfile_;
50 enum Kernel { Gaussian = 0, Epanechnikov = 1, Rectangular = 2,
51 Triangular = 3, Cosine = 4 };
54 std::string tempfile_;
57 Rcpp::NumericVector Yvec_;
65 setTitle(
"Witty WebApp With RInside");
67 std::string tfcmd =
"tfile <- tempfile(pattern=\"img\", tmpdir=\"/tmp\", fileext=\".png\")";
68 tempfile_ = Rcpp::as<std::string>(R_.parseEval(tfcmd));
71 cmd_ =
"c(rnorm(100,0,1), rnorm(50,5,1))";
73 Wt::WGroupBox *wc =
new Wt::WGroupBox(
"Density Estimation", root());
75 Wt::WHBoxLayout *layout =
new Wt::WHBoxLayout();
76 Wt::WContainerWidget *midbox =
new Wt::WContainerWidget(root());
77 layout->addWidget(midbox);
78 Wt::WContainerWidget *container =
new Wt::WContainerWidget(root());
79 layout->addWidget(container);
81 wc->setLayout(layout, AlignTop | AlignJustify);
83 midbox->addWidget(
new WText(
"Density estimation scale factor (div. by 100)"));
84 midbox->addWidget(
new WBreak());
85 spin_ =
new WSpinBox(midbox);
86 spin_->setRange(5, 200);
90 midbox->addWidget(
new WBreak());
91 midbox->addWidget(
new WText(
"R Command for data generation"));
92 midbox->addWidget(
new WBreak());
93 codeEdit_ =
new WLineEdit(midbox);
94 codeEdit_->setTextSize(30);
95 codeEdit_->setText(cmd_);
96 codeEdit_->setFocus();
99 group_ =
new Wt::WButtonGroup(container);
101 Wt::WRadioButton *button;
102 button =
new Wt::WRadioButton(
"Gaussian", container);
103 new Wt::WBreak(container);
104 group_->addButton(button, Gaussian);
106 button =
new Wt::WRadioButton(
"Epanechnikov", container);
107 new Wt::WBreak(container);
108 group_->addButton(button, Epanechnikov);
110 button =
new Wt::WRadioButton(
"Rectangular", container);
111 new Wt::WBreak(container);
112 group_->addButton(button, Rectangular);
114 button =
new Wt::WRadioButton(
"Triangular", container);
115 new Wt::WBreak(container);
116 group_->addButton(button, Triangular);
118 button =
new Wt::WRadioButton(
"Cosine", container);
119 new Wt::WBreak(container);
120 group_->addButton(button, Cosine);
122 group_->setCheckedButton(group_->button(kernel_));
125 Wt::WGroupBox *botbox =
new Wt::WGroupBox(
"Resulting chart", root());
126 imgfile_ =
new Wt::WFileResource(
"image/png", tempfile_);
127 imgfile_->suggestFileName(
"density.png");
128 img_ =
new Wt::WImage(imgfile_,
"PNG version", botbox);
130 Wt::WGroupBox *stbox =
new Wt::WGroupBox(
"Status", root());
131 greeting_ =
new WText(stbox);
132 greeting_->setText(
"Setting up...");
139 kernel_ = group_->checkedId();
144 cmd_ = codeEdit_->text().toUTF8();
145 std::string rng =
"y <- " + cmd_ +
";";
152 bw_ = spin_->value();
157 const char *kernelstr[] = {
"gaussian",
"epanechnikov",
"rectangular",
"triangular",
"cosine" };
158 greeting_->setText(
"Starting R call");
159 R_[
"tfile"] = tempfile_;
161 R_[
"kernel"] = kernelstr[kernel_];
163 std::string cmd0 =
"png(filename=tfile,width=600,height=400); plot(density(y, bw=bw/100, kernel=kernel), xlim=range(y)+c(-2,2), main=\"Kernel: ";
164 std::string cmd1 =
"\"); points(y, rep(0, length(y)), pch=16, col=rgb(0,0,0,1/4)); dev.off()";
165 std::string cmd = cmd0 + kernelstr[kernel_] + cmd1;
167 imgfile_->setChanged();
168 greeting_->setText(
"Finished request from " + this->environment().clientAddress() +
" using " + this->environment().userAgent()) ;
181 int main(
int argc,
char **argv) {
DensityApp(const WEnvironment &env, RInside &R)
WApplication * createApplication(const WEnvironment &env)
static RInside & instance()
int main(int argc, char **argv)