闪亮:绘制名称包含交互式输入值的图形

时间:2018-03-30 14:55:38

标签: r graph shiny plotly

在ShinyApp中,我想绘制一个名称具有交互式输入值的图形。所以在ui.R方面,用户选择0,1或2的输入值。在server.R方面,我希望App绘制一个名称为pl0,pl1或pl2的图形。也就是说,如果用户选择0作为输入值,则App绘制图形pl0,对于输入1的pl1和pl2和输入2也是如此。我使用绘图库来绘制图形。

我尝试过print(),plot(),return(),但它们都没有用。 任何解决方案或建议将不胜感激。非常感谢你!

这是我的ui.R

library(shiny)

shinyUI(fluidPage(

  # Application title
  titlePanel("Star Cluster Simulations"),

  # Sidebar with a slider input for time
  sidebarLayout(
    sidebarPanel(
      sliderInput(inputId = "time",
                  label = "Select time to display a snapshot",
                  min = 0,
                  max = 2,
                  value = 0)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotlyOutput("distPlot")
    )
  )
))

这是我的服务器.R

library(shiny)
library(plotly)

# load data
for(i in 0:2) {
  infile <- paste0("Data/c_0", i, "00.csv")
  a <- read.csv(infile)
  b <- assign(paste0("c_0", i, "00"), a)
  names(a) <- paste0("c_0", i, "00")
  pl <- plot_ly(b, x = ~x, y = ~y, z = ~z, color = ~id) %>%
    add_markers() %>%
    layout(scene = list(xaxis = list(title = 'x'),
                        yaxis = list(title = 'y'),
                        zaxis = list(title = 'z')))
  assign(paste0("pl", i), pl)
}

# shinyServer
shinyServer(function(input, output) {
  output$distPlot <- renderPlotly({

    # this doesn't work
    print(paste0("pl", input$time)) 

  })
})

1 个答案:

答案 0 :(得分:0)

我无法对此进行测试,因为您的问题不可重复(即不包含数据),但有一种方法可以在文本值之间切换(即从Shiny输入返回的值)和R对象是通过制作使用switch函数的反应式表达式。您可以在plot.data()(或任何其他渲染函数)中调用反应式表达式(在下面的情况下为renderPlotly)以在数据集之间切换。

shinyServer(function(input, output) {

  plot.data <- reactive({
    switch(paste0("pl", input$time),
           "pl0" = pl0,
           "pl1" = pl1,
           "pl2" = pl2)
  })

  output$distPlot <- renderPlotly({
    plot.data()
  })

})