我正在制作一个R Shiny应用程序,其中图形类型在线条和堆叠区域之间切换。我想要一个滑动条它通过y轴值来过滤输入数据。当图形类型堆叠时,y轴的最大值明显高于线形图。当图形类型改变时,我如何更新滑块的最大值?如下面的代码所示,我试图使用observeEvent,但是没有达到预期的效果。任何帮助都将非常感激(我承认plotly可以处理其中的一些问题,但总的来说,我不喜欢这个包)。
library(shiny)
library(tidyverse)
# simulate some grouped data
mydata=bind_rows(lapply(LETTERS[1:5],function(x){
as_tibble(data.frame(xvals=seq(1,100,1))) %>%
mutate(grp=x) })) %>%
rowwise() %>%
mutate(yvals=runif(1)) %>%
ungroup() %>%
group_by(grp) %>%
arrange(xvals) %>%
mutate(yvals=cumsum(yvals)) %>%
ungroup()
ui=fluidPage(
titlePanel("Dev reactive yaxis"),
sidebarLayout(
sidebarPanel(
radioButtons('graphType',"",c("line","stacked"),"line"),
uiOutput("ylimits")),
mainPanel(plotOutput("myplot"))))
server=function(input,output,session) {
## y slider
output$ylimits=renderUI({
# req(ymax())
req(input$graphType)
if(input$graphType=="line"){
ymax=max(mydata$yvals,na.rm=T)
} else{
temp=mydata %>%
filter(yvals==max(yvals,na.rm=T))
ymax=sum(temp$yvals,na.rm=T)
}
sliderInput('yslider','',min=0,max=ymax,value=c(0,ymax))
})
## update slider when graph type changes. This doesn't seem to work :(
observeEvent(input$graphType=="stacked",{
# rv$ymax<-funGety
## get max value for yaxis
if(input$graphType=="line"){
ymax=max(mydata$yvals,na.rm=T)
} else{
temp=mydata %>%
filter(yvals==max(yvals,na.rm=T))
ymax=sum(temp$yvals,na.rm=T)
}
updateSliderInput(session=session,'yslider','',min=0,max=ymax,value=c(0,ymax))
})
## plot data
pdat=reactive({
req(input$yslider)
mydata %>%
filter(yvals>input$yslider[1]&yvals<input$yslider[2])
})
## make plot
myplot=reactive({
req(pdat())
req(input$graphType)
ggplot(pdat(),aes(xvals,yvals))+
{ if (input$graphType=="line") geom_line(aes(colour=grp)) else geom_area(aes(fill=grp)) }
})
## render plot
output$myplot=renderPlot({
req(myplot())
myplot()
})
}
shinyApp(ui=ui,server=server)
假设您想根据每个"xvals":
的观察值总和来筛选堆叠图表mydata %>% group_by(xvals) %>% summarize(total_yvals = sum(yvals,na.rm=T))
max()应该搜索每xvals的总和,以获得滑块的最大值,并且应该在data.frame中过滤每xvals的总和。
这段代码为我工作:
server=function(input,output,session) {
## y slider
output$ylimits=renderUI({
# req(ymax())
req(input$graphType)
if(input$graphType=="line"){
ymax=max(mydata$yvals,na.rm=T)
} else{
# get the max value out of the summed up entries on each xvals
ymax = mydata %>% group_by(xvals) %>% summarize(yvals = sum(yvals,na.rm=T)) %>% pull(yvals) %>% max()
}
sliderInput('yslider','',min=0,max=ymax,value=c(0,ymax))
})
## plot data
pdat=reactive({
req(input$yslider,input$graphType)
# join the sum of the stacked areas to allow for filtering
mydata <- mydata %>% left_join(
mydata %>% group_by(xvals) %>% summarize(total_yvals = sum(yvals,na.rm=T)),
by = "xvals"
) %>% as.data.frame()
# depending on the selection filter either individual observations or the sum of the stacked areas
if(input$graphType == "line"){
mydata <- mydata %>%
filter(yvals>input$yslider[1]&yvals<input$yslider[2])
} else{
mydata <- mydata %>%
filter(total_yvals>input$yslider[1]&total_yvals<input$yslider[2])
}
return(mydata)
})
## render plot
output$myplot=renderPlot({
req(pdat(),input$graphType,input$yslider)
p <- ggplot(pdat(),aes(xvals,yvals))+
{ if (input$graphType=="line") geom_line(aes(colour=grp)) else geom_area(aes(fill=grp)) }
return(p)
})
}