修改用户输入数据

时间:2017-03-13 04:29:20

标签: r shiny visualization

library(shiny)
ui <- fluidPage(
  checkboxGroupInput("data", "Select data:",
                     c("Iris" = "iris",
                       "Cars" = "mtcars")),
  plotOutput("myPlot")
)

server <- function(input, output) {
  dat <- reactive({
    switch()
  })
  output$myPlot <- renderPlot({
    dat <- switch(input$data, 
                  "iris" = iris,
                  "mtcars" = mtcars)
    plot(Sepal.Width ~ Sepal.Length, data = get(input$data))
  })
}

shinyApp(ui, server)

上面是一个简单的应用程序,提示用户选择一个数据集,然后使用数据集绘制图形。我想修改它,以便用户可以指定一些值t,它也会传递到plot语句中。

library(shiny)
ui <- fluidPage(
  checkboxGroupInput("data", "Select data:",
                     c("Iris" = "iris",
                       "Cars" = "mtcars")),
  sidebarLayout(
    sidebarPanel(
      sliderInput("t",
                  "Scale:",
                  min = -5,
                  max = 5,
                  value = 2, step = 1,
                  width = "100%")

    ),
    mainPanel( plotOutput("myPlot"))
  )
)

server <- function(input, output) {
  dat <- reactive({
    switch()
  })
  output$myPlot <- renderPlot({
    t = input$t
    dat <- switch(input$data, 
                  "iris" = iris,
                  "mtcars" = mtcars)
    plot(Sepal.Width ~ Sepal.Length * t, data = get(input$data))
  })
}

shinyApp(ui, server)

但是,我收到以下错误声明:variable lengths differ (found for 't')。我希望实现的是将t列附加到用户输入数据集。我试过dat$t = t,但似乎没有用。

1 个答案:

答案 0 :(得分:0)

如果您在formulaSepal.Width ~ Sepal.Length * t)内进行计算,则需要use I() to bracket the portions of the formula where the operators are used in their arithmetic sense

plot(Sepal.Width ~ I(Sepal.Length * t), data = get(input$data))

更新:如果您想对数据进行多种操作,我建议创建一个反应函数(dat)来根据用户输入计算数据,并且然后使用data.frame返回的dat()对象作为绘图中的输入数据:

server <- function(input, output) {
  dat <- reactive({
    if (input$data == "iris") {
      df <- iris
      # Do any calculations based on user input (here input$t)
      df$Sepal.Length <- df$Sepal.Length * input$t
    }
    df
  })

  output$myPlot <- renderPlot({
    plot(Sepal.Width ~ Sepal.Length, data = dat())
  })
}

要使这个工作跨多个数据集,让dat()函数重命名依赖(Sepal.Width irismtcars中的其他内容)和独立({{1}在Sepal.Length)中,例如irisy然后在您的绘图中使用x(或为每个数据集编写单独的绘图函数)。