R Shiny为Plotly折线图选择痕迹?

时间:2016-04-22 17:19:51

标签: r shiny plotly

我正在尝试使用Shiny选择我想在使用Plotly渲染的多线图中绘制的变量。我有很多变量所以我想选择使用Shiny而不是使用Plotly的交互式传奇"点击"选择机制。 示例数据:

library(plotly)                       
# Example dataframe
foo <-data.frame( mon  = c("Jan", "Feb", "Mar"),
                  var_1 = c(100, 200, 300),
                  var_b = c(80, 250, 280),
                  var_three = c(150, 120,201)
                )

直接使用Plotly时,我可以使用以下代码手动添加跟踪:

p <- plot_ly(x = foo$mon, y = foo$var_1, line = list(shape="linear"))
p <- add_trace(p, x = foo$mon, y = foo$var_b)
p <- add_trace(p, x = foo$mon, y = foo$var_three)
print(p)

现在我想使用Shiny复选框来选择我希望在绘图上看到的变量。选择是在输入$ show_vars中捕获的,但是如何循环并绘制这个变化的变量列表?这是我的app.R代码,它手动绘制其中一个变量。建议赞赏!

#------------------------------------------------------------------------------
# UI 
#------------------------------------------------------------------------------
ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            checkboxGroupInput('show_vars', 'Columns in the dataset', names(foo),
                               selected = c('mon', 'var_1')),
            helpText('Select the variables to show in the graph.')
        ),
        mainPanel(
            plotlyOutput("myPlot")
        )
    )
)
#------------------------------------------------------------------------------
# SERVER 
# Need to loop through input$show_vars to show a trace for each one?
#------------------------------------------------------------------------------
server <- function(input, output) {
    # a large table, reative to input$show_vars
    output$uteTable = renderDataTable({
        library(ggplot2)
        ute[, input$show_vars, drop = FALSE]
    })

    output$myPlot = renderPlotly({
        plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
        ## How to add the other traces selected in input$show_vars??
    })
}
shinyApp(ui = ui, server = server)

更新:我现在意识到我需要脚本来避免硬编码第一个图使用foo $ var_1。该图应该使用复选框中的任何一个可能的选择(减去$ mon,我已从选择列表中删除)。当我尝试使第一个绘图语句有条件时,我得到消息&#34;错误:最后一个绘图不存在。&#34;即,这不起作用:

output$myPlot = renderPlotly({
    # p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
    for (item in input$show_vars) {
        if (item == 1){
            p <- plot_ly(x=foo$mon, y=foo[[item]], line = list(shape="linear"))
        }
        if(item > 1){
           p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE)
        }
    }
    print(p)

1 个答案:

答案 0 :(得分:2)

看看这是不是你想要的。另外,您可能希望删除checkboxGroup中的前两项,以便它们不可移除(取决于您的需要)。

output$myPlot = renderPlotly({
    p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear"))
    ## How to add the other traces selected in input$show_vars??
    for (item in input$show_vars) {
        p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE)
    }
    print(p)
})