Почему гистограмма не обновляется на основе реактивных данных? - PullRequest
0 голосов
/ 18 мая 2018

Вопрос

Несмотря на то, что оба используют один и тот же фрейм реактивных данных, почему гистограмма не соответствует данным, показанным в таблице в моем приложении ?

Обзор

В настоящее время я размещаю фрейм данных iris в df - реактивное выражение , которое использует ввод переключателя и упорядочивает данные на основена base::switch().После этого df отображается в двух формах: гистограмма и таблица.

Беда в том, что гистограмма не реагирует на переключатель, в то время как таблица реагирует.Мой желаемый результат - расположение гистограммы в порядке возрастания / убывания - на основе переключателя - таким же образом, как таблица.

Любые разъяснения о том, почему это происходит и как я могу решить эту проблему, будут очень благодарны!

Screenshot of App

Код

# load necessary package
library( shiny )
library( tidyverse )

# create UI
ui <- fluidPage(
  title = "Reactive Programming"
  , plotOutput( outputId = "my.barplot" )
  , radioButtons( inputId = "direction"
                  , label = "Arrange the data:"
                  , choices = c("Ascending", "Descending")
                  , selected = "Descending"
                  , inline = TRUE )
  , tableOutput( outputId = "my.table" )
)

# create server
server <- function( input, output, session){

  # arrange iris in ascending/descending order based on the "Sepal.Length" column
  df <- reactive({
    switch( EXPR = input$direction
            , "Ascending" = iris %>% arrange( Sepal.Length ) 
            , "Descending" = iris %>% arrange( desc( Sepal.Length ) ) )
  })

  # plot df()
  output$my.barplot <- renderPlot({
    ggplot( data = df() ) +
      geom_bar( aes( x = Species
                     , y = Sepal.Length )
                , stat = "identity" )
  })

  # show df()
  output$my.table <- renderTable({
    df()
  })
}

# run App
shinyApp( ui = ui, server = server )

# end of script #

Информация о сеансе

R version 3.4.4 (2018-03-15)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.2

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] forcats_0.3.0   stringr_1.3.0   dplyr_0.7.4     purrr_0.2.4     readr_1.1.1    
 [6] tidyr_0.8.0     tibble_1.4.2    ggplot2_2.2.1   tidyverse_1.2.1 shiny_1.0.5    

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.16     cellranger_1.1.0 pillar_1.2.1     compiler_3.4.4  
 [5] plyr_1.8.4       bindr_0.1.1      tools_3.4.4      digest_0.6.15   
 [9] lubridate_1.7.3  jsonlite_1.5     nlme_3.1-131.1   gtable_0.2.0    
[13] lattice_0.20-35  pkgconfig_2.0.1  rlang_0.2.0      psych_1.7.8     
[17] cli_1.0.0        rstudioapi_0.7   yaml_2.1.18      parallel_3.4.4  
[21] haven_1.1.1      bindrcpp_0.2     xml2_1.2.0       httr_1.3.1      
[25] hms_0.4.2        grid_3.4.4       glue_1.2.0       R6_2.2.2        
[29] readxl_1.0.0     foreign_0.8-69   modelr_0.1.1     reshape2_1.4.3  
[33] magrittr_1.5     scales_0.5.0     htmltools_0.3.6  rvest_0.3.2     
[37] assertthat_0.2.0 mnormt_1.5-5     colorspace_1.3-2 mime_0.5        
[41] xtable_1.8-2     httpuv_1.3.6.2   stringi_1.1.7    lazyeval_0.2.1  
[45] munsell_0.4.3    broom_0.4.3      crayon_1.3.4 

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Обзор

Благодаря @Gregor я понял, что моей ошибкой было не понимание того, что порядок гистограммы определяется уровнем фактора.

Пока ответ @Vedha Viyash работает, я объединил совет @Gegor, чтобы использовать dplyr::mutate() для изменения df()$Species с помощью stats::reorder() для установки уровнейв df()$Species будет организовано df()$Sepal.Length.

Это учитывает принцип DRY , не повторяя построение объекта заговора внутри output$my.barplot.

Screenshot of shiny app

# load necessary package
library( shiny )
library( tidyverse )

# create UI
ui <- fluidPage(
  title = "Reactive Programming"
  , plotOutput( outputId = "my.barplot" )
  , radioButtons( inputId = "direction"
                  , label = "Arrange the data:"
                  , choices = c("Ascending", "Descending")
                  , selected = "Descending"
                  , inline = TRUE )
  , tableOutput( outputId = "my.table" )
)

# create server
server <- function( input, output, session){

  # arrange iris in ascending/descending order based on the "Sepal.Length" column
  df <- reactive({
    switch( EXPR = input$direction
            , "Ascending" = iris %>% arrange( Sepal.Length ) %>% mutate( Species = reorder( x = Species, X = Sepal.Length ) )
            , "Descending" = iris %>% arrange( desc( Sepal.Length ) ) %>% mutate( Species = reorder( x = Species, X = desc( Sepal.Length ) ) ) )
  })

  # plot df()
  output$my.barplot <- renderPlot({
    ggplot( data = df() ) +
      geom_bar( aes( x = Species
                     , y = Sepal.Length )
                , stat = "identity" )
  })

  # show df()
  output$my.table <- renderTable({
    df()
  })
}

# run App
shinyApp( ui = ui, server = server )

# end of script #
0 голосов
/ 18 мая 2018

Вам не нужно изменять порядок данных в ggplot, чтобы изменить порядок на графике.Вы должны указать его в функциях графика:

Я создал условие if-else для создания разных графиков при нажатии Ascending или Descending.Посмотрите на код.Я только что добавил критерии переупорядочения в функции geom_bar()

Код:

library( shiny )
library( tidyverse )

# create UI
ui <- fluidPage(
  title = "Reactive Programming"
  , plotOutput( outputId = "my.barplot" )
  , radioButtons( inputId = "direction"
                  , label = "Arrange the data:"
                  , choices = c("Ascending", "Descending")
                  , selected = "Descending"
                  , inline = TRUE )
  , tableOutput( outputId = "my.table" )
)

# create server
server <- function( input, output, session){

  # arrange iris in ascending/descending order based on the "Sepal.Length" column
  df <- reactive({
    switch( EXPR = input$direction
            , "Ascending" = iris %>% arrange( Sepal.Length ) 
            , "Descending" = iris %>% arrange( desc( Sepal.Length ) ) )
  })

  # plot df()
  output$my.barplot <- renderPlot({
    if(input$direction=="Ascending")
      ggplot( data = df() ) +
      geom_bar( aes( x = Species
                     , y = Sepal.Length )
                , stat = "identity" )
    else if(input$direction=="Descending")
      ggplot( data = df() ) +
      geom_bar( aes( x = reorder(Species,-Sepal.Length)
                     , y = Sepal.Length )
                , stat = "identity" )
  })

  # show df()
  output$my.table <- renderTable({
    df()
  })
}

# run App
shinyApp( ui = ui, server = server )

Вы можете использовать labs(), чтобы переименовать ось, если хотите

Выходное блестящее приложение здесь Shiny Output

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