Блестящие входные переменные выборочно игнорируются ggplot - PullRequest
1 голос
/ 23 мая 2019

Я хочу, чтобы мое блестящее приложение могло отображать фреймы данных с различным количеством столбцов.Поскольку я не ожидаю, что данные будут содержать более 5 столбцов, я написал явный список всех возможных случаев для объекта ggplot.Я также хочу, чтобы размер первого объекта был переменным с помощью ползунка в пользовательском интерфейсе.

Проблема в том, что значение этого ползунка распознается только для данных с более чем одним столбцом.

Чтобы проверить это, вот пример данных с одним столбцом данных: 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 голосов
/ 30 мая 2019

Итак, я наконец-то нашел ошибку.Проблема в том, что scale_y_continuous автоматически изменяет масштаб оси Y на размер элементов графика.В моем случае это не проявилось, если бы я добавил элементы графика фиксированного размера (как это делается программой, если данные содержат более одного столбца), которые также устанавливают ограничения на размер оси Y.Решение в данном конкретном случае для меня заключалось в том, чтобы вместо этого использовать ylim(-0.2005, 0.2005), следовательно, фиксировать размер оси Y.

0 голосов
/ 23 мая 2019

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

})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...