2017-03-22 7 views
0

私はポアソン分布からサンプリングしているShinyアプリを書いています。私は、データのプロットや要約を出力するたびに関数を書き直しました。私はむしろ関数を一度しか使用せずに、すべてのプロットとサマリーを関数が呼び出された1回だけ参照するようにしてください。そうでない場合、結果は出力全体で同一ではありません。関数を一度呼び出すと、ggplotで使用する変数として結果を格納しようとしたとき、ggplotが反応的なデータを使用できないというエラーが発生し、データフレームに変換することができませんでした。Shinyアプリで同じ手順を何回も繰り返さないようにする方法

私が試したのバリエーション:ggplot入力を使用することができなかったとして、彼らは、動作しませんでしたしかし

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

を。私は反応機能を正しく使用していないと思う。コードの冗長性を減らし、プロットとサマリーがすべて同じ単一の基礎データを使用していることを確認するための助けがあれば、大歓迎です。前もって感謝します。

私の現在のコード:

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) 
    }) 


} 
+0

あなたの 'ggplot'呼び出しで反応式を呼び出す必要があります。 'ggplot(myData()、aes(...))+ ...' – SymbolixAU

+0

も参照してください[この回答](http://stackoverflow.com/a/40336002/5977215) – SymbolixAU

答えて

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) 
+0

ありがとうございました。私はRstudio GUIを使ってアプリケーションを実行していますが、コンソールから起動できるようにする 'shinyApp(ui = ui、server = server)'部分はありますか? – user964689

+0

app.Rの最後にそれを書くことができます。RStudioは、「Run/Source」を「Run App」に置き換えます。これは、光るアプリで作業していることを知っているからです。あなたがあなたのapp.Rにそれを加えないならば、あなたはすべてを入手し、 'shinyApp(ui、server)'でコンソールを使ってアプリケーションを起動することができます。 – shosaco

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)) 
関連する問題