2016-06-29 6 views
0

データフレームをデータテーブルとして表示するアプリケーションを構築しようとしています。サイドバーパネルでselectinputとdaterange入力フィルタを使ってデータテーブルをサブセット化する機能をユーザに提供したいと思っていました。相続人R Filterinputsが変更されるまでフィルタ入力がない状態でShiny display full dataframe

私が問題に遭遇し、

  • それだけで、すべての入力が
  • を選択されたときの入力のいずれかが変更されたときに、アプリ
  • のロードに空データテーブルを表示するデータテーブルのサブセットそれは datatableを更新しません。ここで

は、光沢のあるアプリのための私のサンプルコードです

Region <- c("USA","UK","JPN","JPN","UK","USA","USA") 
Company <- c("A","B","C","A","B","C","A") 
Status <- c("Completed","In Production","In Design","New","In Production","In Design","New") 
date <- c("2015-05-01","2015-05-01","2015-06-04","2015-06-20","2015-07-15","2015-08-12","2015-08-12") 
date <- as.Date(date,"%Y-%m-%d") 

df <- data.frame(Region, Company, Status, date) 

UIファイルはアプリがそうでない起動するとサーバーのファイルが

server.R 

shinyServer(function(input,output){ 

    output$table <- renderTable({ 
    datadf %>% as.data.frame() %>% filter(Region == input$region & Company == input$company & Status == input$status) 
     }) 
}) 

ある

ui.R 

shinyUI(
    fluidPage(
     titlePanel("Summary"), 

sidebarLayout(
     sidebarPanel(

      selectInput("region", 
         label = "Choose a Region", 
         choices = c("", unique(df$Region))), 

      selectInput("company", 
         label = "Choose a company", 
         choices = c("", unique(df$Company))), 

      selectInput("status", 
         label = "Choose Proj status", 
         choices = c("", unique(df$Status))), 

      dateRangeInput("projdate", 
         label = "Date of interest:", 
         start = Sys.Date() - 60, 
         end = Sys.Date()) 
      ), 

     mainPanel(
      dataTableOutput("table") 
     ) 
     ) 
    )) 

ですフィルタを適用せずにテーブルを表示します。 私が望む出力を得るために、出力$ table関数のすべてを実行しているかどうかはわかりません。

ユーザー入力がなくてもどのようにデータテーブルを表示し、ユーザー入力が変更されたときにデータテーブル更新がどのように表示されるか教えてくれたら、

反応的な環境で入力要因を配置しようとしましたが、反応的なコンテキストがないと操作が許可されませんでした。

+0

フィルタを 'filter(%%in selection)'に変更する必要があります。ここで、 'selection'は何も選択されていない場合のすべてのオプションのベクトルです。 –

+0

「selection = c(input $ Region、$ companyを入力し、$ Statusを入力してください)」のように入力すると、入力の1つが選択された場合、それらの入力に一致するデータテーブルが表示されますか?ありがとう – user6529266

+0

まだ複数のフィルタが必要ですが、何も選択されていない場合、すべてのオプションが選択されていると仮定する必要があります。たとえば、領域が選択されていない場合、 'selection'はすべての領域のベクトルでなければなりません。それ以外の場合は、空の結果が得られます。 –

答えて

1

===更新された回答===

ここには実用的な解決策があります。ここ

library(shiny) 
library(dplyr) 

Region <- c("USA","UK","JPN","JPN","UK","USA","USA") 
Company <- c("A","B","C","A","B","C","A") 
Status <- c("Completed","In Production","In Design","New","In Production","In Design","New") 
date <- c("2015-05-01","2015-05-01","2015-06-04","2015-06-20","2015-07-15","2015-08-12","2015-08-12") 
date <- as.Date(date,"%Y-%m-%d") 

df <- data.frame(Region, Company, Status, date) 

ui <- shinyUI(
    fluidPage(
    titlePanel("Summary"), 

    sidebarLayout(
     sidebarPanel(

     selectInput("region", 
        label = "Choose a Region", 
        choices = c("", as.vector(unique(df$Region)))), 

     selectInput("company", 
        label = "Choose a company", 
        choices = c("", as.vector(unique(df$Company)))), 

     selectInput("status", 
        label = "Choose Proj status", 
        choices = c("", as.vector(unique(df$Status)))), 

     dateRangeInput("projdate", 
         label = "Date of interest:", 
         start = Sys.Date() - 60, 
         end = Sys.Date()) 
    ), 

     mainPanel(
     tableOutput("table") 
    ) 
    ) 
)) 

server <- shinyServer(function(input,output){ 

    output$table <- renderTable({ 
    region_sel <- if (nchar(input$region)==0) unique(as.vector(df$Region)) else input$region 
    company_sel <- if (nchar(input$company)==0) unique(as.vector(df$Company)) else input$company 
    status_sel <- if (nchar(input$status)==0) unique(as.vector(df$Status)) else input$status 

    filter(df, Region %in% region_sel, Company %in% company_sel, Status %in% status_sel) 
    }) 
}) 

shinyApp(ui = ui, server = server) 

===前の回答===

ない直接的な答えが、あなたを助けるかもしれない非常に同様の例です。

library(shiny) 
library(dplyr) 

ui <- shinyUI(fluidPage(

    titlePanel("Old Faithful Geyser Data"), 

    sidebarLayout(
     sidebarPanel(
     selectInput("cyl", "cyl", unique(mtcars$cyl), multiple = TRUE), 
     selectInput("vs", "vs", unique(mtcars$vs), multiple = TRUE), 
     selectInput("am", "am", unique(mtcars$am), multiple = TRUE) 
    ), 

     mainPanel(
     tableOutput("table") 
    ) 
    ) 
)) 

server <- shinyServer(function(input, output) { 

    output$table <- renderTable({ 
     cyl_sel <- if (is.null(input$cyl)) unique(mtcars$cyl) else as.numeric(input$cyl) 
     vs_sel <- if (is.null(input$vs)) unique(mtcars$vs) else as.numeric(input$vs) 
     am_sel <- if (is.null(input$am)) unique(mtcars$am) else as.numeric(input$am) 
     filter(mtcars, cyl %in% cyl_sel, vs %in% vs_sel, am %in% am_sel) 
    }) 

}) 

shinyApp(ui = ui, server = server) 
+0

これは多くのことを明確にして、数値の代わりに文字入力を表示するように編集することができました。私は複数の= Tを削除しようとしたので、テーブルは各入力の変数のうちの1つだけをフィルタリングしますが、それは大丈夫です。各selectInput関数で複数の入力ではなく1つの入力を選択し、それに応じてデータフレームをソートするにはどうしたらいいですか?どんな援助も深く感謝します。実行可能なソリューションに導いてくれてありがとう。 – user6529266

+0

私は完全に実用的なソリューションを投稿しました。更新された答え –

+0

を参照してください。nchar関数を使用してください。入力をありがとう、今私はそれをより明確に理解することができます! – user6529266

0

Server.R

shinyServer(function(input,output,session){ 


    data_update <- reactive({ 

    # Compose data frame 
    data.frame(
     Name = c("Region", 
       "Company", 
       "Status"), 
     Value = as.character(c(input$region, 
          input$company, 
          input$status)), 
     stringsAsFactors=FALSE) 
    }) 

    # Show the values using an HTML table 
    output$table <- renderTable({ 
    data_update() 
    }) 
}) 

UI.R

shinyUI(
    fluidPage(
    titlePanel("Summary"), 

    sidebarLayout(
     sidebarPanel(

     selectInput("region", 
        label = "Choose a Region", 
        choices = c("", unique(df$Region)), selected= '1'), 

     selectInput("company", 
        label = "Choose a company", 
        choices = c("", unique(df$Company)), selected= '1'), 

     selectInput("status", 
        label = "Choose Proj status", 
        choices = c("", unique(df$Status)), selected= '1'), 

     dateRangeInput("projdate", 
         label = "Date of interest:", 
         start = Sys.Date() - 60, 
         end = Sys.Date()) 
    ), 

     mainPanel(
     tableOutput("table") 
    ) 
    ) 
)) 

GLOBAL.R

library(shiny) 
library(dplyr) 
library(DT) 

Region <- c("USA","UK","JPN","JPN","UK","USA","USA") 
Company <- c("A","B","C","A","B","C","A") 
Status <- c("Completed","In Production","In Design","New","In Production","In Design","New") 
date <- c("2015-05-01","2015-05-01","2015-06-04","2015-06-20","2015-07-15","2015-08-12","2015-08-12") 
date <- as.Date(date,"%Y-%m-%d") 

df <- data.frame(Region, Company, Status, date) 

私はまた、あなたのテーブルをプロットするためにDTパッケージを使用することをお勧めします。

希望すると助かります!歓声

+0

お返事ありがとうございます。私はDTパッケージでデータ出力可能な出力を生成することができましたが、データフレームをサブセット化する代わりに入力として値を表示するテーブルを生成します。私は、入力の1つが与えられたときに、ディスプレイをdfデータテーブルのサブセットにしたいと思います。たとえば、RegionがUSAとして選択されている場合、RegionはRegionと一致するフィールドのみのデータテーブルでなければなりません。同様にCompanyがCとして選択された場合、ディスプレイは地域内のUSAと会社内のCでなければなりません。それは私が抱えていた問題です。 – user6529266

関連する問題