2017-09-27 10 views
0

下記のサンプルdfに示すようなデータがあります。 3つの米国州(CA、TX、NY)と合計のデータがあり、それぞれについてはact、予測はfct、予測値はpredとなります。checkboxGroupInputを使用してdfをサブセット化し、ggplot2をRで作成します。Shiny

私は、ユーザがプロット上で観察する状態を選択することができるシャイニー(Shiny)アプリを作成したいと考えています。これを行うにはcheckboxGroupInputを使用しています。私はユーザの選択状態に基づいてdfをサブセット化する私のコードのサーバ部分にという名前のreactive関数を持っています。次に、reactiveという名前の関数をglという名前で作成し、ggplotを作成するために必要なすべてのgeom_line()ステートメントを作成します。私がこれをやっているのは、それぞれの状態について同じcolorを同じにしておき、linetypeを使って実際のものか、予測か、予測されたものかを区別するためです。

最後に、私はプロットを作成しようとしますが、ここで問題が始まります。エラーメッセージは表示されませんが、アプリケーションを実行するとプロットは表示されません。これを修正する方法、または私が望むものを達成するためのより良い方法はありますか?以下は、私が持っているコードとユーザーがすべての州と合計を選択した場合に表示したいもののプロットです。

library(shiny) 
library(ggplot2) 
library(scales) 
library(lubridate) 

df <- data.frame(Date=seq.Date(as.Date('2017-01-01'), as.Date('2017-05-01'), by='month'), 
     CAact=rnorm(5, 10, 2), TXact=rnorm(5, 10, 2), NYact=rnorm(5, 10, 2),Totalact=rnorm(5, 30, 2), 
     CAfct=rnorm(5, 10, 2), TXfct=rnorm(5, 10, 2), NYfct=rnorm(5, 10, 2), Totalfct=rnorm(5, 30, 2), 
     CApred=rnorm(5, 10, 2), TXpred=rnorm(5, 10, 2), NYpred=rnorm(5, 10, 2), Totalpred=rnorm(5, 30, 2) 
    ) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     checkboxGroupInput('states', 'Select Regions', 
     choices=c('CA','TX','NY','Total'), 
     selected=c('CA','TX','NY','Total') 
    ) 
    ), 
    mainPanel(
     plotOutput('portfolio') 
    ) 
) 
) 

server <- function(input, output){ 

    #Function to subset df based on user selected states 
    DF <- reactive({ 
    df <- df[,c('Date', names(df)[grep(paste(input$states, collapse='|'), names(df))])] 
    return(df) 
    }) 

    #Generate all the 'geom_line' statements to create ggplot 
    gl <- reactive({ 
    gl <- character() 
    lt <- 1 
    for(i in 2:length(DF())){ 
     col <- substr(names(DF())[i], 1, 2) 
     if(grepl('Total', names(DF())[i])){ 
     col <- 'Total' 
     } 
     if(grepl('fct', names(DF())[i])){ 
     lt <- 5 
     } else if(grepl('pred', names(DF())[i])){ 
     lt <- 4 
     } 
     line <- paste0("geom_line(aes(y=", names(DF())[i], ", color='", col, "'), linetype=", lt, ", size=1.25) + ") 
     gl <- paste0(gl, line) 
    } 
    }) 

    #Create ggplot (not working) 
    output$portfolio <- renderPlot({ 
    paste0("ggplot(data=DF(), aes(Date)) + ", gl(), "labs(x='', y='Balances ($B)')") 
    }) 

} 

shinyApp(ui, server) 

enter image description here

答えて

1

エラーは、それが反応物であるので、あなたはgl()としてglを参照する必要があるため

paste0("ggplot(data=TP, aes(Date)) + ", gl, "labs(x='', y='Balances ($B)')")

で発生しています。その機能にはtpregオブジェクトが存在しないようにこれを固定した後、

DF <- reactive({ 
    df <- df[,c('Date', names(df)[grep(paste(input$states, collapse='|'), names(df))])] 
    return(tpreg) 
    }) 

に別のエラーがあります。 return(df)に変更されました。

プロットには何も表示されません。私は残りの部分を修正するのに役立つと思ったが、私は

UPDATE ...私は働くことはよく分からないので、一緒にプロットを誰paste()を見たことがない:

[OK]をクリックします。

library(shiny) 
library(ggplot2) 
library(scales) 
library(lubridate) 
library(tidyr) 

df <- data.frame(Date=seq.Date(as.Date('2017-01-01'), as.Date('2017-05-01'), by='month'), 
       CAact=rnorm(5, 10, 2), TXact=rnorm(5, 10, 2), NYact=rnorm(5, 10, 2),Totalact=rnorm(5, 30, 2), 
       CAfct=rnorm(5, 10, 2), TXfct=rnorm(5, 10, 2), NYfct=rnorm(5, 10, 2), Totalfct=rnorm(5, 30, 2), 
       CApred=rnorm(5, 10, 2), TXpred=rnorm(5, 10, 2), NYpred=rnorm(5, 10, 2), Totalpred=rnorm(5, 30, 2) 
) 


df <- gather(df, Variable, Value, -Date) 
df$State <- gsub('act|fct|pred', '', df$Variable) 
df$Variable <- gsub('CA|NY|TX|Total', '', df$Variable) 
df$State <- factor(df$State, levels = c('CA','NY','TX','Total')) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     checkboxGroupInput('states', 'Select Regions', 
         choices=c('CA','TX','NY','Total'), 
         selected=c('CA','TX','NY','Total') 
    ) 
    ), 
    mainPanel(
     plotOutput('portfolio') 
    ) 
) 
) 

server <- function(input, output){ 

    #Function to subset df based on user selected states 


    color.groups <- c(CA = 'green', TX = 'blue', NY = 'red', Total = 'black') 
    line.types <- c(pred = 1, act = 4, fct = 5) 

    #Generate all the 'geom_line' statements to create ggplot 


    #Create ggplot (not working) 
    output$portfolio <- renderPlot({ 
    sub <- subset(df, subset = State %in% input$states) 
    ggplot(sub, aes(x = Date, y = Value, col = State))+ 
     geom_line(aes(linetype = Variable))+ 
     scale_color_manual(values = color.groups)+ 
     scale_linetype_manual(values = line.types) 
    }) 



} 

shinyApp(ui, server) 
+0

ありがとう、私はエラーを修正しましたが、あなたが言うように、プロットは表示されません。 –

+0

私は物事を一緒に貼り付けるのではなく、これをもう少し伝統的にやります。 'state.colors < - c(CA = 'red'、TX = 'green'、NY = 'blue'、Total = 'orange')のような名前付きベクトルを作成することで、次に、ここに示すように 'scale_color_manual()'を使ってください:https://stackoverflow.com/questions/46410688/how-to-create-box-plots-with-all-points-where-for-each-group-the-上記の私の答えでは、p-46410885#46410885の色です。 – Balter

+0

この例をあなたの答えに入れることができますか? –

関連する問題