ggplot有选择地忽略闪亮的输入变量

时间:2019-05-23 10:01:11

标签: r ggplot2 shiny

我希望我闪亮的应用程序能够绘制具有不同列数的数据框。由于我不希望数据包含超过5列,因此我为ggplot对象编写了所有可能情况的显式列表。我还希望使用UI上的滑块来可变第一个对象的大小。

问题是该滑块的值仅可用于多于一列的数据。

要对此进行测试,请参见带有一个数据列的示例数据: https://drive.google.com/file/d/182Qi-2I37OscSeLir_AyXdoedstIxx6D/view?usp=sharing

这里有两个: https://drive.google.com/file/d/1eB0eKvgfj94xIp80P0SG3QnoGZJ1Zq9a/view?usp=sharing

这是我的第一个问题,我不确定如何使用fileInput为闪亮的应用程序提供理想的示例。请让我知道是否有比这更好的方法。

#The ui

shinyUI(

  pageWithSidebar(

    headerPanel(""),

    sidebarPanel(

      fileInput(inputId = "file", label = "Choose an Excel (.xlsx) File", 
                multiple = FALSE, 
                accept = c("text/xlsx", "text/microsoft-excel-pen-XML-format-spreadsheet-file", ".xlsx"),
                width = NULL, buttonLabel = "Find...",
                placeholder = "No File selected"
      ),

      sliderInput(inputId = "width", label = "width", min = 0.01, max = 0.4, value = 0.2, step = 0.01)),

    mainPanel(plotOutput("graph"), height = "600px", quoted = TRUE)
  )
)

#and the server

library(shiny)
library(ggplot2)
library(readxl)


shinyServer(function(input, output, session) {

  data <- reactive({
            data.frame(read_xlsx(input$file$datapath))
           })


  output$graph <- renderPlot({

      print(

        #somehow the interactive heigth setting is now muted within the expression
        ggplot(data(), aes(x = data()[,1], y = "", fill = as.factor(data()[2:ncol(data())])) ) +
        {if(ncol(data()) >= 2)geom_tile(aes(x = data()[,1], y = 0, fill = as.factor(data()[,2])), data(), width = 0.2, height = input$width, size = 2)} + 
        {if(ncol(data()) >= 3)geom_tile(aes(x = data()[,1], y = 0.125, fill = as.factor(data()[,3])), data(), width = 0.2, height = 0.02, size = 2)} +
        {if(ncol(data()) >= 4)geom_tile(aes(x = data()[,1], y = -0.125, fill = as.factor(data()[,4])), data(), width = 0.2, height = 0.02, size = 2)} +
        {if(ncol(data()) == 5)geom_tile(aes(x = data()[,1], y = -0.145, fill = as.factor(data()[,5])), data(), width = 0.2, height = 0.02, size = 2)}

          scale_y_continuous(breaks = NULL, labels = NULL)
          )



  })
})

2 个答案:

答案 0 :(得分:0)

renderPlot({...})已处于反应状态。您可以放下PLOT <-reactive({print(,然后直接进入ggplot()

总的来说,我想我会做这样的事情:

output$graph <- renderPlot({

  df <- data()
  names(df) <- paste0("v", 1:length(df))


  # initial plot
  p <- 
    ggplot(df, aes(x = v1)) + 
    scale_y_continuous(breaks = NULL, labels = NULL)


  # conditions
  if (ncol(df) >= 2) { 
    p <- p + geom_tile(aes(y = 0, fill = as.factor(v2), width = 0.2, height = input$width, size = 2)
  }


  if (ncol(df) >= 3) { 
    p <- p + geom_tile(aes(y = 0.125, fill = as.factor(v3), width = 0.2, height = 0.02, size = 2)
  }


  etc...

  # return
  p

})

答案 1 :(得分:0)

所以,我终于找到了错误。问题是scale_y_continuous自动将y轴缩放为绘图元素的大小。就我而言,如果我添加了固定大小的绘图元素(如果数据包含多个列,则由程序完成),也不会出现,这也对y轴的大小设置了限制。在我这种情况下,解决方案是改为使用ylim(-0.2005, 0.2005),从而固定y轴大小。