根据Shiny中单击的复选框生成多个图

时间:2018-09-15 09:40:50

标签: r shiny

我正在尝试制作闪亮的应用程序。

我希望我的应用根据单击的复选框数生成多个图。虹膜是具有各种定量变量的数据框,我正在尝试动态生成虹膜中4个变量的密度图。 到目前为止,这是我的服务器和ui页面。

library(shiny)
library(ggplot2)
library(tidyverse)


df<-iris[,colnames(iris)!="Species"]

ui<-fluidPage(

titlePanel("Density Plots of Quantitative Variables"),
sidebarLayout( sidebarPanel( sliderInput("bw","Slide to change bandwidth 
                                         of Plot",min=0.1,max=20,value=3,step=0.1,animate=TRUE),

                             checkboxGroupInput("variableinp","Choose variables",
                                                choices=colnames(df),selected = colnames(df)[1]),verbatimTextOutput("value")
),
mainPanel( plotOutput("densityplot"))
)
)


server<-function(input,output){

# observeEvent(input$variableinp, {
#      print((input$variableinp))
#  })

output$densityplot <- renderPlot({

    if(!is.null(input$variableinp)) {

        getoutandquant <- function(x) {
            q1<-quantile(x)[[2]]
            q3<-quantile(x)[[4]]
            IQR<-q3-q1

            out1<-q3+(1.5)*IQR
            out2<-q1-(1.5)*IQR

            #Finding the list of points which are outliers for a particular 
           variable.
            out<-x[x>out1]
            out2<-x[x<out2]
            outliers<-tibble(x=c(out,out2),y=0)

            return(outliers)
        }
        nplot<-length(input$variableinp)
        x<-input$variableinp

        for ( i in 1:nplot) {
            outlier<-getoutandquant(df[,x[i]])

        }    

        p1<-ggplot(df,aes_string(input$variableinp[i]))+
            stat_density(geom="line",adjust=input$bw)+ ylab("Density\n")
        p1+geom_point(data=outlier,aes(x,y),shape=23)
    }
})
}


shinyApp(ui=ui,server=server)

下面是我的输出。可以看出,仅生成一个图。选中2个复选框,我想要2个图,选中3个复选框,3个图,依此类推。 :

Density Plots of variables

任何人都可以给我提示或指导我该怎么做。我的情节正在好转。我只需要根据单击的复选框数来生成多个图。

1 个答案:

答案 0 :(得分:0)

尝试将您的hello world输出存储在一个列表中,然后使用ggplotdo.call将所有输出合并为一个图:

尝试以下代码,它应该可以完美运行: 您应该安装grid.arrange软件包以合并多个ggplot。

gridExtra

此外,如果能解决您的问题,请选择此帖子作为最佳答案,谢谢您一百万。