r - 根据在 Shiny 中单击的复选框生成多个绘图

标签 r shiny

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

我希望我的应用程序根据单击的复选框数量生成多个绘图。 Iris 是具有各种定量变量的数据框,我正在尝试动态生成 iris 中 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

任何人都可以给我提示或任何关于我应该如何做的线索。我的地 block 正在产生良好的效果。我只需要根据单击的复选框数量生成多个绘图。

最佳答案

尝试将 ggplot 输出存储在一个列表中,然后使用 do.callgrid.arrange 将所有输出合并为一个情节:

尝试以下代码,它应该可以完美运行: 您应该安装gridExtra包来组合多个ggplot。

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

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 
        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

      p<-list()
      for ( i in 1:nplot) {
        outlier<-getoutandquant(df[,x[i]])
        p[[i]]<-ggplot(df,aes_string(input$variableinp[i]))+
          stat_density(geom="line",adjust=input$bw)+ ylab("Density\n")+
          geom_point(data=outlier,aes(x,y),shape=23)
      }    
      do.call(grid.arrange,p)
    }
  })
}


shinyApp(ui=ui,server=server)

另外,如果这篇文章解决了您的问题,请选择它作为最佳答案,万分感谢。

关于r - 根据在 Shiny 中单击的复选框生成多个绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52343518/

相关文章:

r - 如何创建一个弹出窗口供用户在 R shiny 中输入信息?

r - ggplot2 和 Shiny 的 : how to scale the size of legend with figure size?

r - `range` 和 `pips` 参数如何在shinyWidgets `noUiSliderInput()` 中工作?

Shiny 的应用程序 selectInput 和 radioButtons 中的响应式(Reactive)更新 - ggvis

r - R中的子串提取

r - 检查多列是否匹配 R 数据框中的值

r - 如何独立于 bookdown 中的主要文本控制代码块的字体大小和线条拉伸(stretch)?

r - Shiny 无法在 RStudio 的浏览器中打开

algorithm - 非常特殊矩阵的最大子矩形

r - 将 hive 连接到R时出现java.lang.classnotfoundexception错误