如何避免在Shiny应用程序中多次重复相同的过程

时间:2017-03-22 21:33:50

标签: r shiny redundancy

我写了一个Shiny应用程序,我从泊松分布中采样。每次我想输出数据的图或摘要时,我都重写了这个函数。我宁愿只使用一次函数,然后让所有的图和摘要都引用调用函数的单次时间,否则结果在输出中将不相同。当我试图调用函数一次并将结果存储为ggplot使用的变量时,我得到了ggplot无法使用反应数据的错误,我无法将其强制转换为数据框。

我尝试了各种变体:

mydata <- reactive({
  x <- input$x
  y <- input$y
  z <- input$z
  Muts <- as.data.frame(rpois(100,(x*y*z)))
  Muts
})

然而它们没有用,因为ggplot无法使用输入。我想我没有正确使用反应功能。任何有助于减少代码冗余并确保绘图和摘要都使用相同的单个底层数据的帮助非常受欢迎。提前谢谢。

我目前的代码:

server.R

library(shiny)
library(ggplot2)

# Define server logic required to draw a histogram
function(input, output) {




  output$distPlot <- renderPlot({

    x <- input$x
    y <- input$y
    z <- input$z
    Muts <- as.data.frame(rpois(100,(x*y*z)))


    # draw the density plot

    ggplot(Muts, aes(Muts)) + geom_density() 

  })

  output$distPlot2 <-renderPlot({

    x <- input$x
    y <- input$y
    z <- input$z
    Muts <- as.data.frame(rpois(100,(x*y*z)))



    Muts <- as.data.frame(Muts)

    ggplot(Muts, aes(Muts)) + geom_histogram() 

  })

  output$summary <- renderPrint({
    x <- input$x
    y <- input$y
    z <- input$z
    Muts <- as.data.frame(rpois(100,(x*y*z)))

    summary(Muts)
  })


}

2 个答案:

答案 0 :(得分:1)

您的想法是正确的,它正在使用以下代码:

library(shiny)
library(ggplot2)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel(""),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
         sliderInput("x",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         sliderInput("y",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         sliderInput("z",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30)
      ),

      # Show a plot of the generated distribution
      mainPanel(
         plotOutput("distPlot"),
         plotOutput("distPlot2"),
         verbatimTextOutput("summary")
      )
   )
)

# Define slibrary(shiny)


# Define server logic required to draw a histogram
server <- function(input, output) {

  mydata <- reactive({
    x <- input$x
    y <- input$y
    z <- input$z
    Muts <- as.data.frame(rpois(100,(x*y*z)))
    Muts
  })


  output$distPlot <- renderPlot({
    Muts <- mydata()
    ggplot(Muts, aes(Muts)) + geom_density() 
  })

  output$distPlot2 <-renderPlot({
    Muts <- mydata()
    ggplot(Muts, aes(Muts)) + geom_histogram() 
  })

  output$summary <- renderPrint({
    Muts <- mydata()
    summary(Muts)
  })


}

# Run the application 
shinyApp(ui = ui, server = server)

答案 1 :(得分:1)

请务必致电mydata()以实际获取您的被动对象的价值。

library(shiny)
library(ggplot2)


ui <- fluidPage(
numericInput("x", "x", 2), numericInput("y", "y", 2), numericInput("z", "z", 2),
plotOutput("distPlot"), plotOutput("distPlot2"))

server <- function(input, output) {

  mydata <- reactive({
    x <- input$x
    y <- input$y
    z <- input$z
    data.frame(x=rpois(100,(x*y*z)))
  })


  output$distPlot <- renderPlot({

    ggplot(mydata(), aes(x)) + geom_density() 

  })

  output$distPlot2 <-renderPlot({

    ggplot(mydata(), aes(x)) + geom_density() 

  })
}

runApp(list(ui=ui, server=server))