r Shiny在不同的绘图包之间进行选择

时间:2015-04-16 21:23:27

标签: r plot shiny rcharts

我有一个任务,我需要构建一个rShiny应用程序,允许用户选择使用哪种R绘图包以显示绘图。

目前我唯一可以使用(半体面)的方法是在服务器端为每个包使用特定于包的函数,并在UI端使用一系列条件面板。< / p>

然而问题是当用户第一次进入页面时,所有图都被初始化。第二个问题是当用户更改某些绘图输入值并在此之后选择另一个包时,将显示旧绘图,直到创建新绘图。

问题:

  • 这是唯一可用的方法吗?
  • 我觉得必须有一种方法可以使用反应函数来选择包?
  • 我觉得应该可以在ui中使用单个rShiny的htmlOutput(或类似的东西),因此不需要switchPanel?

我创建了一个小应用来演示我当前的实现和两个问题:

server.R

library(shiny)
#library(devtools)
#install_github("ramnathv/rCharts")
library(rCharts)

shinyServer(function(input, output) {
  names(iris) = gsub("\\.", "", names(iris))

  #Render the Generic plot
  output$GenericPlot <- renderPlot({
    data = iris[0:input$variable,]
    plot(data$SepalLength ~ data$SepalWidth)
  })

  #Render the Polychart plot
  output$PolychartPlot <- renderChart({
    plotData <- rPlot(SepalLength ~ SepalWidth, data = iris[0:input$variable,], color = 'Species', type = 'point')
    plotData$addParams(dom = 'PolychartPlot')
    return(plotData)
  })

  #Render the NDV3 plot
  output$NDV3Plot <- renderChart({
    plotData <- nPlot(SepalLength ~ SepalWidth, data = iris[0:input$variable,], group = 'Species', type = 'scatterChart')
    plotData$addParams(dom = 'NDV3Plot')
    return(plotData)
  })
})

ui.R

library(shiny)
library(rCharts)

shinyUI(fluidPage(

  sidebarLayout(
    sidebarPanel(
      selectInput("lib", label = "Library:",
                  choices = list("Generic", "rCharts Polychart", "rCharts NDV3"),
                  selected = "Generic"
      ),

      numericInput("variable", "Observations:",
                   min = 5,
                   max = 150,
                   value = 10
      )

    ),

    mainPanel(
      conditionalPanel(
        condition = "input.lib == 'Generic'",
        h3("Generic plot"),
        plotOutput("GenericPlot")
      ),

      conditionalPanel(
        condition = "input.lib == 'rCharts Polychart'",
        h3("rCharts Polychart plot"),
        showOutput("PolychartPlot", "polycharts")
      ),

      conditionalPanel(
        condition = "input.lib == 'rCharts NDV3'",
        h3("rCharts NDV3 plot"),
        showOutput("NDV3Plot", "nvd3")
      )
    )
  )
))

最终版本将使用不同的数据集和更多图表包。提供的代码更像是一个玩具示例,其中大部分内容都被删除了。

2 个答案:

答案 0 :(得分:1)

在应用程序的输出部分中创建一个部分,其中包含一些基于输入的逻辑。例如,

library(shiny)
library(ggplot2)
data(cars)
server <- function(input, output) {output$plot<- renderPlot({
  if (input$lib == "base") {
    p <- plot(cars$speed, cars$dist)
  } else if (input$lib == "ggplot") {
    p <- ggplot(cars, aes(x = speed, y = dist)) + geom_point()
  }
  p
})
}



ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("lib", "Library: ", choices = list("base", "ggplot"),
                  selected = "base")
    ),
    mainPanel(plotOutput("plot"))
  )
)

shinyApp(ui = ui, server = server)

这提供了一个图,一旦我更改了lib选项,它就会重新生成。

答案 1 :(得分:1)

找到解决我问题的方法。解决方案基本上是在uiOutput()中使用ui.R并将plotOutput()showOutput()方法移至server.R。

基于iacobus代码的解决方案:

ui.R

library(shiny)
library(rCharts)

shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("lib", "Library: ", choices = list("base", "ggplot", "Polychart"),
                  selected = "base")
    ),
    mainPanel(uiOutput("plot"))
  )
))

server.R

library(shiny)
library(ggplot2)
library(rCharts)
data(cars)
server <- function(input, output) {

  output$plot<- renderUI({
    if (input$lib == "base") {
      plotOutput("base") 
    } else if (input$lib == "ggplot") {
      plotOutput("ggplot")
    } else if (input$lib == "Polychart") {
      showOutput("polychart", "polycharts")
    }
  })

  output$base <- renderPlot({
    plot(cars$speed, cars$dist)
  })

  output$ggplot <- renderPlot({
    ggplot(cars, aes(x = speed, y = dist)) + geom_point()
  })

  output$polychart <- renderChart({
    p <- rPlot(speed ~ dist, data = cars, type = "point")
    p$addParams(dom = 'plot')
    p
  })

}

我遇到了困难,因为我认为plotOutput()showOutput()等方法只能在ui.R中使用。但事实并非如此。

修改 事实证明,这对于pollyCharts与其他rCharts包一起正常工作是不够的。

相反,我使用renderUI和rCharts $show来显示内联图表。以下链接对我有用:https://github.com/ramnathv/rCharts/issues/373。在使用htmlOutput

的用户名单中