R Shiny Action Button to Affect Reactive Control
I'd like to plot a histogram of step-data that is show when the App is first run and that bit is working. So is the changing of the bins and the color of the plot density. One of the features I would like to include is the ability for the user to click an actionButton or some other action-toggle to overlay a dnorm-line on the histogram. On or off would be preferable.
However, I'm only able to get the code to draw the overlay line once at this point. I tried using the 'isolate' function from this idea here but couldn't figure out the implementation in my code.
Ideally, the plot would look something like (ignoring finer points of plot control) where the user clicks a "toggle" to add or remove the curve:
w<-rnorm(1000)
hist(w,col="red",freq=F,xlim=c(-5,5))
curve(dnorm,-5,5,add=T,col="blue")
ui.R
library(shiny)
# Define UI for application that draws a histogram
shinyUI(fluidPage(
# Application title
titlePanel("Data Products - Final Project"),
# Sidebar with a slider input for the number of bins
sidebarLayout(
sidebarPanel(
helpText("Select some of the features of the histogram."),
sliderInput("bins", label = h4("Number of bins: ")
, min = 5
, max = 50
, value = 10),
radioButtons("radio-color", helpText("Select a color for density plot."),
choices = list("Salmon" = "salmon", "Black" = "black"
,"Red" = "red", "Dark Blue" = "darkblue"
, "Dark Grey" = "darkgrey")
,selected = "salmon"),
actionButton("hist-dnorm", label = "Add Curve")
),#end sideBarPanel
# Show a plot of the generated distribution
mainPanel(
h1("Lorem Ipsum", align = "left"),
p("Some paragraph text", align = "left"),
plotOutput("histPlot"),
plotOutput("histLine")
)#End mainPanel
)#End sidebarLayout
)#End fluidPage
)#End ShinyUI
server.R
Hopefully you can see my scratch code for the curve whose elements are currently commented out because I can't figure out how to implement them in the code. The are (m, s, xfit, yfit, yfit2 and hline)
library(shiny)
library(caret)
library(ggplot2)
library(dplyr)
library(lubridate)
dat <- read.csv("data/fitbit_data.csv", stringsAsFactors = FALSE)
dat$Day <- weekdays(x = as.Date(dat$Date, "%m/%d/%Y", label = TRUE, abbr = FALSE))
dat$Steps <- as.numeric(sub(",","",dat$Steps))
dat$Steps[dat$Steps == 0 & is.numeric(dat$Steps)] <- NA
dat$Calories.Burned <- as.numeric(sub(",","",dat$Calories.Burned))
dat$Calories.Burned[dat$Calories.Burned == 0
& is.numeric(dat$Calories.Burned)] <- NA
dat$Minutes.Sedentary <- as.numeric(sub(",","",dat$Minutes.Sedentary))
dat$Minutes.Sedentary[dat$Minutes.Sedentary == 0
& is.numeric(dat$Minutes.Sedentary)] <- NA
dat$Activity.Calories <- as.numeric(sub(",","",dat$Activity.Calories))
dat$Activity.Calories[dat$Activity.Calories == 0
& is.numeric(dat$Activity.Calories)] <- NA
# Define server logic required to draw a histogram
shinyServer(function(input, output) {
output$histPlot <- renderPlot({
steps <- dat$Steps
bins <- seq(min(steps, na.rm = TRUE), max(steps, na.rm = TRUE)
, length.out = input$bins + 1)
h <- hist(dat$Steps, breaks = bins, density = 10, col = input$`radio-color`
, xlim = c(500, 25000)
, xlab = "# of Steps"
, ylab = "Frequency"
, main = "Histogram of Steps")
isolate(
output$histLine <- renderPlot({
m <- mean(dat$Steps, na.rm = TRUE)
s <- sqrt(var(dat$Steps, na.rm = TRUE))
xfit <- seq(min(dat$Steps, na.rm = TRUE)
, max(dat$Steps, na.rm = TRUE), length = 40)
yfit <- dnorm(xfit, mean = m, sd = s)
yfit2 <- yfit*diff(h$mids[1:2])*length(dat$Steps)
lines(xfit, yfit2, col = "darkblue", lwd = 2)
})
)
})
#end isolate
})#end shinyServer
Questions
Thanks for your time and consideration
这是一个概念证明。
library(shiny)
# Define UI for application that draws a histogram
ui <- shinyUI(fluidPage(
# Application title
titlePanel("Toggle line"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
actionButton("button", "Toggle line")
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
))
# Define server logic required to draw a histogram
server <- shinyServer(function(input, output) {
w<-rnorm(1000)
output$distPlot <- renderPlot({
hist(w,col="red",freq=F,xlim=c(-5,5))
if (input$button%%2 == 0) {
curve(dnorm,-5,5,add=T,col="blue")
}
})
})
# Run the application
shinyApp(ui = ui, server = server)
链接地址: http://www.djcxy.com/p/89142.html
上一篇: 在闪亮的仪表板中更改边栏的字体颜色
下一篇: R闪亮的动作按钮来影响无功控制