【问题标题】:Shiny plot region based on number of plot基于情节数量的闪亮情节区域
【发布时间】:2018-01-31 10:20:57
【问题描述】:

基本上我要做的是我的用户将选择一个基因,并且取决于基因将取决于情节的数量,范围从 1 到 10 个情节。

我希望能够根据要绘制的绘图数量来解决 UI 绘图宽度这可能吗?

希望下面的代码能帮助说明我的问题,循环遍历“基因”A、B、C 和 D

library(shiny)
library(shinydashboard)

dat = data.frame(gene =c(rep("A",3), rep("B",6), rep("C",1), rep("D",10)), sample1 = runif(10, 0,50), sample2 = runif(10, 0,50),
                 sample3 = runif(10, 0,50),sample4 = runif(10, 0,50),sample5 = runif(10, 0,50),sample6 = runif(10, 0,50))

ui <- dashboardPage(
  dashboardHeader(title = "Title", titleWidth = "300px"),
  dashboardSidebar(
    textInput(inputId = "GoI", label = "Select gene of interest(A,B)", value ="A")),

  dashboardBody(
    tabsetPanel(
      tabPanel("Differential Variability",plotOutput("boxplot"))

    )))      

server <- function(input, output){


  output$boxplot <- renderPlot({dataGoI = dat[dat$gene == input$GoI,]
  i = nrow(dat[dat$gene == input$GoI,])
  g = c(0,0,0,1,1,1)
  if (i > 5){
    if (i == 6){
      zones = matrix(c(1:6), nrow=2, byrow =T)
    }else if (i == 7){
      zones = matrix(c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7), nrow=2, byrow =T)
    } else if (i == 8){
      zones = matrix(c(1:8), nrow=2, byrow =T)
    } else if (i == 9){
      zones = matrix(c(rep(1:5, each=4), rep(6:9,each=5)), nrow =2, byrow =T)
    } else{
      zones = matrix(c(1:10),nrow=2, byrow=T)
    }
  }

  if( i <= 5){
    par(mfrow = c(1, i))
    for(j in 1:i){
      boxplot(as.numeric(dataGoI[j,2:7])~g)
    }
  }else {
    layout(zones)
    for(j in 1:i){
      boxplot(as.numeric(dataGoI[j,2:7])~g)
    }
  }}) 
}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    不确定您想要的确切布局,但我建议您使用 renderUI 服务器端和 uiOutput UI 端。基于您的代码的简单示例将是这样的

    library(shiny)
    library(shinydashboard)
    
    dat = data.frame(gene =c(rep("A",3), rep("B",6), rep("C",1), rep("D",10)), sample1 = runif(10, 0,50), sample2 = runif(10, 0,50),
                     sample3 = runif(10, 0,50),sample4 = runif(10, 0,50),sample5 = runif(10, 0,50),sample6 = runif(10, 0,50))
    
    ui <- dashboardPage(
      dashboardHeader(title = "Title", titleWidth = "300px"),
      dashboardSidebar(
        textInput(inputId = "GoI", label = "Select gene of interest(A,B)", value ="A")),
    
      dashboardBody(
        tabsetPanel(
          tabPanel("Differential Variability",uiOutput("boxplot_ui"))
    
        )))      
    
    server <- function(input, output){
    
    
      output$boxplot <- renderPlot({dataGoI = dat[dat$gene == input$GoI,]
      i = nrow(dat[dat$gene == input$GoI,])
      g = c(0,0,0,1,1,1)
      if (i > 5){
        if (i == 6){
          zones = matrix(c(1:6), nrow=2, byrow =T)
        }else if (i == 7){
          zones = matrix(c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7), nrow=2, byrow =T)
        } else if (i == 8){
          zones = matrix(c(1:8), nrow=2, byrow =T)
        } else if (i == 9){
          zones = matrix(c(rep(1:5, each=4), rep(6:9,each=5)), nrow =2, byrow =T)
        } else{
          zones = matrix(c(1:10),nrow=2, byrow=T)
        }
      }
    
      if( i <= 5){
        par(mfrow = c(1, i))
        for(j in 1:i){
          boxplot(as.numeric(dataGoI[j,2:7])~g)
        }
      }else {
        layout(zones)
        for(j in 1:i){
          boxplot(as.numeric(dataGoI[j,2:7])~g)
        }
      }})
    
      output$boxplot_ui <- renderUI({plotOutput({"boxplot"},width = nrow(dat[dat$gene == input$GoI,])*100)})
    }
    
    shinyApp(ui = ui, server = server)
    

    这里的 UI 宽度将随着绘图的数量而移动。您当然可以根据您的具体需要调整宽度。如您所见,在处理更改 A、B、C、D 的过程中可能会发生错误,因此您可能需要指定 nrow 为空时要采用的宽度

    【讨论】:

    • 这正是我所追求的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 2017-11-07
    • 2018-04-03
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2017-06-14
    相关资源
    最近更新 更多