отсутствующие данные отображаются в приложении Shiny через Plotly - PullRequest
0 голосов
/ 25 января 2019

Добрый день,

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

library(shiny)
library(plotly)
library(tidyverse)

df <- economics

datalst = colnames(df)

ui <- pageWithSidebar(
  headerPanel("test"),
  sidebarPanel(
    selectInput(inputId = "x",
                label = "Choose the x axis",
                datalst),
    selectInput(inputId = "y",
                label = "Choose the y axis",
                datalst, datalst[[2]])


  ),
  mainPanel(

    plotlyOutput("plot")

  )
)

server <- function(input, output) {

    dataset  <- reactive({
      df[, c(input$x, input$y)]
    })


    output$plot = renderPlotly({

      plot_ly(dataset(), x = ~input$x, y = ~input$y,type = 'scatter', mode = 'lines')

    })

}  

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 26 января 2019

Хитрость заключается в том, чтобы избежать нестандартной оценки, потому что input$x и input$y оценивают строки, а при использовании plotly, как в вашем примере, требуются имена столбцов после ~. Вы можете исправить это, например:

server <- function(input, output) {

    dataset  <- reactive({
      df[, c(input$x, input$y)]
    })
    output$plot = renderPlotly({
      plot_ly(x = dataset()[[input$x]], y = dataset()[[input$y]],type = 'scatter', mode = 'lines')
    })

}  

Дальнейшее улучшение может заключаться в том, чтобы «разделить» реактив на две части, так что входные данные графика становятся недействительными и пересчитываются только при изменении соответствующего ввода:

server <- function(input, output) {

    dataset_x  <- reactive({
      df[, input$x]
    })

    dataset_y  <- reactive({
      df[, input$y]
    })
    output$plot = renderPlotly({
      plot_ly(x = dataset_x()[[1]], y = dataset_y()[[1]], type = 'scatter', mode = 'lines')
    })

}  

...