2017-05-22 97 views
1

考虑以下有光泽应用程式:有条件颜色在Plotly单杆,其中R闪亮

UI

library(shiny) 
library(plotly) 
ui <- fluidPage(
    titlePanel("Random Number Generator"), 
    mainPanel(
     plotlyOutput("random_numbers") 
    ) 
) 

SERVER

server <- function(input, output) { 
    df <- reactive({ 
    runif(100) 
    }) 

    output$random_numbers <- renderPlotly({ 
    plot_ly() %>% 
     add_trace(y = sort(df()), 
       type = 'bar', 
       name = 'Random Numbers', 
       marker = list(color = 'green')) %>% 
     add_trace(y = mean(df()), 
       type = 'bar', 
       name = 'Mean', 
       marker = list(color = 'orange')) 
    }) 
} 

输出看起来像这样:

sample graph

问题

有没有一种方法,我可以显示在相同的顺序其他runif(100)相同的跟踪平均值,这样我可以保持升序排列,并保持平均不同的颜色?我希望它看起来像下图:

what it should look like

回答

1

有一种说法x就可以使用。对于那个你可以传递最接近排序数组的索引值。在你的情况下:x = which.min(abs(sort(df()) - mean(df())))

完整的应用程序:

library(shiny) 
library(plotly) 
ui <- fluidPage(
    titlePanel("Random Number Generator"), 
    mainPanel(
    plotlyOutput("random_numbers") 
) 
) 

server <- function(input, output) { 
    df <- reactive({ 
    runif(100) 
    }) 

    output$random_numbers <- renderPlotly({ 
    plot_ly() %>% 
     add_trace(
     x = 1:100, 
     y = sort(df()), 
       type = 'bar', 
       name = 'Random Numbers', 
       marker = list(color = 'green')) %>% 
     add_trace(
     x = which.min(abs(sort(df()) - mean(df()))), 
     y = mean(df()), 
       type = 'bar', 
       name = 'Mean', 
       marker = list(color = 'orange')) 
    }) 
} 


runApp(shinyApp(ui, server), launch.browser = TRUE) 

编辑:更多的代码密集,但正确的解决方案可以在下面找到。

output$random_numbers <- renderPlotly({ 
    full.seq <- 1:(length(df()) + 1) 
    mean.idx <- which.min(abs(sort(df()) - mean(df()))) 
    if((sort(df()) - mean(df()))[mean.idx] < 0) mean.idx <- mean.idx + 1 
    rand.seq <- full.seq[-mean.idx] 

    plot_ly() %>% 
     add_trace(
     x = rand.seq, 
     y = sort(df()), 
     type = 'bar', 
     name = 'Random Numbers', 
     marker = list(color = 'green')) %>% 
     add_trace(
     x = mean.idx, 
     y = mean(df()), 
     type = 'bar', 
     name = 'Mean', 
     marker = list(color = 'orange')) 
    }) 
+0

打我吧:) –

+0

比赛仍然在,因为在它的错误:d – BigDataScientist

+0

是的,但我有工作要做 - 所以它是你的。不知道你做了阴谋:) –