r语言 - Shiny: Reactive sliderInput not working :(



我正在制作一个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)
})
}

最新更新