无法在R Shiny中动态选择绘制变量

时间:2017-08-16 11:05:29

标签: r shiny

目标

我有两个数据表:DT1DT2。每个变量都有一个X变量:x和三个Y变量:y1y2y3。我的目标是创建一个基本的Shiny应用程序,其中数据集和Y变量都可由用户选择。

最小例子

数据

library(data.table)

set.seed(123)

#y1 between 1 and 50
DT1 <- data.table(x=c(1:10),
                 y1 = round(runif(10, 1, 50)))

#y2 between 51 and 100
DT2 <- data.table(x=c(1:10),
                  y1 = round(runif(10, 51, 100)))

#y2 and y3 are double and triple multiples of y1
DT1[, y2 := y1*2][, y3 := y1*3]
DT2[, y2 := y1*2][, y3 := y1*3]

版本1:仅输入数据

library(shiny)
library(ggplot2)

ui <- fluidPage(
  selectInput(inputId = 'input1', label = 'Choose a data table',
              choices = c("1st" = "data1", "2nd" = "data2")),
  plotOutput(outputId = "graph")
)

server <- function(input, output) {
  output$graph <- renderPlot({ 
    dt <- switch(input$input1, data1=DT1, data2=DT2) #data switch
    ggplot(dt, aes(x, y1)) + geom_point() + geom_line()
  })
}

shinyApp(ui, server)

到目前为止,这么好。应用程序正常工作,绘制的数据表可由用户选择。

shiny1

版本2:添加Y变量输入

library(shiny)
library(ggplot2)

ui <- fluidPage(
  selectInput(inputId = 'input1', label = 'Choose a data table',
              choices = c("1st" = "data1", "2nd" = "data2")),
  selectInput(inputId = 'input2', label = 'Choose a Y-variable',
              choices = c("Y-1" = "Y_1", "Y-2" = "Y_2", "Y-3" = "Y_3")),
  plotOutput(outputId = "graph")
)

server <- function(input, output) {
  output$graph <- renderPlot({ 
    dt <- switch(input$input1, data1=DT1, data2=DT2) #data switch
    var <- switch(input$input2, Y_1=y1, Y_2=y2, Y_3=y3) #Y-variable switch
    ggplot(dt, aes(x, var)) + geom_point() + geom_line()
  })
}

shinyApp(ui, server)

这不起作用!

shiny2

有什么问题?

1 个答案:

答案 0 :(得分:0)

y1在您调用它的环境中不存在,它适用于ggplot2 aes和data.table [,因为这些函数使用非标准评估。

要解决您的问题,请执行以下操作:

var <- switch(input$input2, Y_1 = "y1", Y_2 = "y2", Y_3 = "y3")
ggplot(dt, aes_string("x", var)) + geom_point() + geom_line()

如果您在ui中重新定义选项,switch步骤是可选的,例如:choices = c("Y-1" = "y1", "Y-2" = "y2", "Y-3" = "y3"),以及服务器:ggplot(dt, aes_string("x", input$input2)) + geom_point() + geom_line()

您可以阅读: