library(shiny)
library(datasets)
library(XML)
library(ReportingTools)
##custom rendering function for server.R
renderRepTools = function(expr, env=parent.frame(), quoted=FALSE) {
func <- exprToFunction(expr, env, quoted)
function(){
paste(capture.output(func()), collapse="\n")
}
}
##open the report with the shinyHandlers
htmlrep = HTMLReport(reportDirectory = "./",shortName="bigtest", handlers = shinyHandlers)
###define three .modifyDF functions:
##This function does nothing.
noChange <- function(object, ...){ return(object) }
##this function normalizes the columns of the data frame
normalize <- function(object, ...){
for (j in 1:dim(object)[2]){
object[,j] <- (object[,j]-mean(object[,j],na.rm=T))/sd(object[,j],na.rm=T)
}
return(object)
}
##This function subtracts the median from each column
subMedian <- function(object, ...){
for (j in 1:dim(object)[2]){
object[,j] <- object[,j]-median(object[,j],na.rm=T)
}
return(object)
}
# Define server logic required to summarize and view the selected dataset
shinyServer(function(input, output) {
# By declaring datasetInput as a reactive function we ensure that:
#
# 1) It is only called when the inputs it depends on changes
# 2) The computation and result are shared by all the callers (it
# only executes a single time)
# 3) When the inputs change and the function is re-executed, the
# new result is compared to the previous result; if the two are
# identical, then the callers are not notified
#
datasetInput <- reactive(function() {
switch(input$dataset,
"rock" = rock,
"pressure" = pressure,
"cars" = cars)
})
modifyInput <- reactive(function() {
switch(input$modifyFunction,
"raw data" = noChange,
"normalize" = normalize,
"subtract median" = subMedian)
})
# The output$summary depends on the datasetInput reactive function,
# so will be re-executed whenever datasetInput is re-executed
# (i.e. whenever the input$dataset changes)
output$summary <- renderPrint({
dataset <- datasetInput()
summary(dataset)
})
###use RT to display output
output$view2 <- renderRepTools({
publish(datasetInput(), htmlrep, .modifyDF = modifyInput())
})
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.