---
title: A reactive sliced 3D surface response
date : 2013-03-15
--- &lead
```{r setup0, echo=FALSE}
opts_chunk$set(fig.path="assets/fig/rsmShiny", tidy=FALSE)
```
In [my previous article](http://stla.github.io/stlapblog/posts/rgl_knitr.html) I showed an interactive 3D surface response fitted from a model with two continous predictors. But when there is more than two continuous predictors, since we can use only two predictors at time in the image, we can only show a surface plot depending on the fixed values of the other predictors. Here we will build a `Shiny` application allowing to visualize a surface plot *reactive* to the values of the other predictors.
For our illustration we use the (coded) dataset `heli` available in the `rsm` package.
The variables are coded variables `x1`, `x2`, `x3`, `x4`, which respectively are: linear functions of wing area
`A`, wing length ratio `R`, body width `W`, and body length `L`. The experiment was run in two
blocks, and the response variable is `ave`, the average flight time in seconds.
```{r}
library(rsm)
print(heli)
print(heli, decode=FALSE)
```
A second-order response-surface model for these data is fitted using
```{r, message=FALSE}
heli.rsm <- rsm(ave ~ block + SO(x1,x2,x3,x4), data = heli)
```
The fitted surface response is shown below as a function of `x3` and `x4` with
the values of `x1` and `x2` both fixed at $0$:
```{r}
persp(heli.rsm, ~x3+x4, at=list(x1=0,x2=0), col = rainbow(50), contours = "colors")
```
Now we build a `Shiny` application which does the same plot with *reactive* values of `x1` and `x2`.
**ui.R file** defining the user interface:
```{r, eval=FALSE}
library(shiny)
library(rsm)
shinyUI(pageWithSidebar(
# Application title
headerPanel("Sliced 3D plot"),
# Sidebar with two slider inputs
sidebarPanel(
sliderInput("Aslice",
"A:",
min = 11.8,
max = 13,
value = 12.4),
sliderInput("Rslice",
"R:",
min = 2.26,
max = 2.78,
value = 2.52)
),
# Show plot
mainPanel(
plotOutput("surfPlot")
)
))
```
**server.R file** drawing the surface:
```{r, eval=FALSE}
library(shiny)
library(rsm)
heli.rsm <- rsm(ave ~ block + SO(x1,x2,x3,x4), data = heli)
shinyServer(function(input, output){
output$surfPlot <- renderPlot({
x1 <- (input$Aslice - 12.4)/0.6
x2 <- (input$Rslice - 2.52)/0.26
persp(heli.rsm, ~x3+x4, at=list(x1=x1,x2=x2), col = rainbow(50), contours = "colors")
})
})
```
This `Shiny` application you see below is actually hosted at my *Shiny beta hosting account* *ShinyApps hosting account* and
is accessible at [https://stla.shinyapps.io/3Dsliced](https://stla.shinyapps.io/3Dsliced).
I have embedded it here by typing the following html code:
```
```
An interactive and reactive 3D plot ?
---------------------------------------------
Similarly to interactive plots, reactive 3D plots embedded into a html report are great. Now, how to embed an interactive *and* reactive 3D plot ?
There is [an open discussion](https://groups.google.com/forum/#!msg/shiny-discuss/VV-vw3VFpj0/bszBuHkgtS8J) about this possibility in the Shiny Google group. It's just a matter of time.
How could we be able to afford to press the R developers who freely provide these wonderful tools ?