2017-10-24 4 views
1

私はマルチ条件フィルタのコードによってユーザー入力に依存する光沢のあるアプリケーションを作成しようとしています。したがって、「すべて」を選択するとすべてが表示され、選択した入力が他のものと等しい場合は、その入力のデータのみが表示されます。Shiny(R)で動的フィルタを作成する

if文は、dplyrフィルタにコードを挿入します。

サーバー

library(dplyr) 
library(ggplot2) 
library(shiny) 


shinyServer(function(input, output) { 


raw <- diamonds 



    output$cutlist <- renderUI({ 

    cutlist <- sort(unique(as.vector(raw$cut)), decreasing = FALSE) 
    cutlist <- append(cutlist, "All", after = 0) 
    selectizeInput("cutchoose", "Cut:", cutlist) 

}) 


    output$colorlist <- renderUI({ 

colorlist <- sort(unique(as.vector(raw$color)), decreasing = FALSE) 
colorlist <- append(colorlist, "All", 0) 
selectizeInput("colorchoose", "color:", colorlist) 

}) 


    output$table <- renderDataTable({ 



    if(input$colorchoose == "All") { 

    filt1 <- quote(color != "@?><") 


} else { 

    filt1 <- quote(color == input$colorchoose) 

} 


if (input$cutchoose == "All") { 

    filt2 <- quote(cut != "@?><") 


} else { 

    filt2 <- quote(cut == input$cutchoose) 

} 



    raw %>% 
    filter_(filt1) %>% 
    filter_(filt2) 


    }) 

    }) 

UI

shinyUI(fluidPage(

# Application title 
titlePanel("Dynamic Filter Test App"), 


    sidebarLayout(
    sidebarPanel(
    uiOutput("cutlist"), 
    uiOutput("colorlist") 
    ), 


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

コンソール

Warning: Error in if: argument is of length zero 
    Stack trace (innermost first): 
    79: renderDataTable [D:\Independent Learning\R 
     code\dynamFilter/server.R#44] 
    78: func 
    77: origRenderFunc 
    76: output$table 
    1: runApp 

答えて

1

これは私の作品:

output$table <- renderDataTable({ 

    req(input$colorchoose) 
    req(input$cutchoose) 
    if(input$colorchoose == "All") { 

     filt1 <- quote(color != "@?><") 


    } else { 

     filt1 <- paste0("color == ","'",input$colorchoose,"'") 

    } 


    if (input$cutchoose == "All") { 

     filt2 <- quote(cut != "@?><") 


    } else { 

     filt2 <- paste0("cut == ","'",input$cutchoose,"'") 

    } 



    raw %>% 
     filter_(filt1) %>% 
     filter_(filt2) 


    }) 

のreqたstatmentsを初めには完全に適切initliezedされている入力刚性evalutedされるrenderDataTableを防ぐことができます。 2番目の問題は、入力変数がフィルタの動的評価のスコープに含まれていないように見えることでした。そのため、ステートメントを変更して名前の代わりにこれらの変数の値を含めるようにしました。

+0

こんにちはBertil、助けてくれてありがとうございましたが、これは私にとってはうまくいきませんでした – LeeRock

+0

こんにちはbertil、私は別のデバイス上のコードを試して、それは動作します... .....ちょうど私がいるデバイスのようです... – LeeRock

0

I:

私はこれを適切に説明を願って、任意の助けをいただければ幸い、以下のコードを参照してください似ていた一度エラーが発生します。原因は、ステートメントに必要な値がinputという値を生成するために、renderUIの式が時間内に必ずしも評価されないということだと思います。 selectInput()renderUI式には実質的に反応性の値がないので、uiスクリプトに入れてserverスクリプトから取り除くことができます。

これは私の作品:

library(dplyr) 
library(ggplot2) 
library(shiny) 

raw <- diamonds 
cutlist <- sort(unique(as.vector(raw$cut)), decreasing = FALSE) %>% 
    append("All", after = 0) 
colorlist <- sort(unique(as.vector(raw$color)), decreasing = FALSE) %>% 
    append("All", 0) 

server <- function(input, output) { 
    output$table <- renderDataTable({ 
    if(input$colorchoose == "All") { 
     filt1 <- quote(color != "@?><") 
     } else { filt1 <- quote(color == input$colorchoose) } 
    if (input$cutchoose == "All") { 
     filt2 <- quote(cut != "@?><") 
     } else { filt2 <- quote(cut == input$cutchoose) } 
    filter_(raw, filt1) %>% filter_(filt2) }) } 

ui <- shinyUI(fluidPage(
    titlePanel("Dynamic Filter Test App"), 
    sidebarLayout(
    sidebarPanel(
     selectizeInput("cutchoose", "Cut:", cutlist), 
     selectizeInput("colorchoose", "color:", colorlist)), 
    mainPanel(dataTableOutput("table"))))) 

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

こんにちはアレックス、私は残念ながら、これを試してみました!あなたの助けをありがとう – LeeRock

+0

ありがとうアレックス、私は別のデバイスでこれを試して、それもうまく動作します!私のデバイスだから – LeeRock

+0

クール、あなたの質問に答えたら、私の答え(またはBertil's)にチェックマークを付けてください。 –

関連する問題