将反应性输入传递到 R Shiny 中绘图图表的轴

Passing Reactive Input into axis of a plotyly chart in R Shiny

我目前正在尝试开发一个闪亮的应用程序,它可以输出简单线性回归和图表的摘要。对于这两种情况,我都希望用户 select 来自 table 列的自变量和因变量,并将这些相同的输入用于 运行 回归和图表。现在我不知道如何将用户 selected 输入传递到 plotly 中进行显示。任何人都可以提供帮助,在此先感谢!

示例数据如下:

        AvgIR SumCount            AvgLTV     AvgGFEE   AvgRTC       Date
1: 0.04106781   180029 0.753180543134717 0.002424778 319.6837 2015-10-01
2: 0.04036154   160061 0.738038310394162 0.002722529 312.6314 2015-11-01
3: 0.04001407   145560 0.739287372904644 0.002425912 313.0351 2015-12-01
4: 0.04034078   147693 0.739693214979721 0.002600640 315.0238 2016-01-01
5: 0.04055688   142545 0.734515977410642 0.002449523 310.3950 2016-02-01
6: 0.04007467   176344 0.735780463185592 0.002459228 309.9615 2016-03-01

这是ui:

ui <- fluidPage(
  headerPanel("Regression and Time Series Analysis"), 
  sidebarPanel(
    p("Select a Dependent Variable"),
    selectInput(inputId = "DepVar", label = "Dependent Variables", multiple = FALSE, choices = names(RegData2)),
    p("Select input(s) for the Independent Variable(s)"),
    selectInput(inputId = "IndVar", label = "Independent Variables", multiple = FALSE, choices = list( "SumCount", "AvgIR", "AvgLTV", "AvgGFEE", "AvgRTC", "Date"), selected = "AvgLTV"),
    p("Summary of Regression"),
    verbatimTextOutput(outputId = "RegSum")
  ),
  mainPanel(
    verbatimTextOutput(outputId = "IndPrint"),
    verbatimTextOutput(outputId = "DepPrint"),
    verbatimTextOutput(outputId = "test"),
    verbatimTextOutput(outputId = "xaxis"),
    verbatimTextOutput(outputId = "yaxis"),
    tableOutput("table"),
    plotlyOutput("graph")
  )
)

这是服务器:

server <- function(input, output) {

    lm1 <- reactive({lm(reformulate(input$IndVar, input$DepVar), data = RegData2)})

    Ind <- reactive({input$IndVar})
    Dep <- reactive({input$DepVar})
    plotdata <- reactive({as.data.frame(RegData2[, c(which(names(RegData2) == Ind()), which(names(RegData2) == Dep())), with = FALSE])})

    xaxis <- reactive({names(RegData2)[which(names(RegData2) == Ind())]})
    yaxis <- reactive({names(RegData2)[which(names(RegData2) == Dep())]})

#     xaxisN <- reactive({names(xaxis())})
#     yaxisN <- reactive({names(yaxis())})

    output$table <- renderTable({
      x<-plotdata()
        #RegData2[, c(which(names(RegData2) == Ind()), which(names(RegData2) == Dep())), with = FALSE]

    })

    output$graph <- renderPlotly({

      #xaxis <- paste(input$IndVar)
      #yaxis <- paste(input$DepVar)

      #THIS ONE WORKS, but isn't reactive
      #plot<-plot_ly(plotdata(), x =  ~AvgLTV, y = ~AvgIR, mode = "markers", type = "scatter")

      #THIS ONE DOESN'T WORK, is reactive
      plot<-plot_ly(plotdata(), x = ~input$IndVar, y = ~input$DepVar, mode = "markers", type = "scatter")


    })


    output$IndPrint <- renderPrint({str(Ind())})
    output$test <- renderPrint({str(plotdata())})
    output$xaxis <- renderPrint({xaxis()})
    output$yaxis <- renderPrint({yaxis()})
    output$DepPrint <- renderPrint({input$DepVar})
    output$RegSum <- renderPrint({summary(lm1())})

}

shinyApp(ui = ui, server = server)

我认为问题是你不能在 plotly 中使用变量选择器,就像 aes_string 函数在 ggplot2 中为你做的那样 - 至少你尝试的方式是这样。

可能有一种方法可以在 plotly 中传递角色名称,但文档真的不是很好,我什么也找不到。

但是我确实完成了这项工作 - 这是可以接受的。

  • 将绘图数据帧放入局部变量 df。
  • 使用要绘制的变量创建了两个新变量 xx 和 yy
  • 使用 layout 命令覆盖 xaxisyaxis 标签。

这使得 output$graph 看起来像这样:

  output$graph <- renderPlotly({

    df <- plotdata()
    df$xx <- df[[input$IndVar]]
    df$yy <- df[[input$DepVar]]
    plot<-plot_ly(df, x = ~xx, y = ~yy, mode = "markers", type = "scatter") %>% 
                      layout( xaxis = list( title=input$IndVar), 
                              yaxis = list( title=input$DepVar ) )
    plot
  })

产量:

注意:以下是我重新格式化和输入数据的方式,以防有人需要重现 - 花了大约 5 分钟:

AvgIR <- c(0.04106781,0.04036154,0.04001407,0.04034078,0.04055688,0.04007467  )
SumCount <-c(180029 ,160061 ,145560 ,147693 ,142545 ,176344 )
AvgLTV <-c(0.753180543134717 ,0.738038310394162 ,0.739287372904644 ,0.739693214979721 ,0.734515977410642 ,0.735780463185592 )
AvgGFEE<-c(0.002424778 ,0.002722529 ,0.002425912 ,0.002600640 ,0.002449523 ,0.002459228 )
AvgRTC <-c(319.6837,312.6314 ,313.0351 ,315.0238 ,310.3950 ,309.9615 )
Date <- c("2015-10-01","2015-11-01","2015-12-01","2016-01-01","2016-02-01","2016-03-01")
RegData2 <- data.frame(AvgIR=AvgIR,SumCount=SumCount,AvgLTV=AvgLTV,AvgGFEE=AvgGFEE,AvgRTC=AvgRTC,Date=Date)
RegData2$Date <- as.POSIXct(RegData2$Date)