R Блестящий связанный флажок GroupInputs - PullRequest
1 голос
/ 17 апреля 2020

Привет всем,

Мне нужна ваша помощь, пожалуйста: у меня есть фрейм данных с именем data_test, вы можете воспроизвести его с помощью следующих строк:

 PC<-c('001','002','003','004','005','006','007','008','009','010')
 A<-c('2','2','1','1','2','0','2','0','1','0')
 B<-c('0','2','0','0','1','0','0','0','1','0')
 C<-c('1','0','0','0','2','2','0','0','0','1')
 D<-c('1','0','1','1','0','2','1','1','2','2')
 E<-c('0','0','0','2','2','0','0','0','0','2')
 F<-c('0','1','1','1','0','0','2','0','0','0')
 data_test <- data.frame(PC, A, B, C, D, E, F)

И у меня есть три chekboxGroupInputs с именем "variable1 "," переменная 2 "и" переменная 3 ". Каждый из этих chekboxGroupInputs имеет следующие варианты: «Да» = «1», «Нет» = «2», «Возможно» = «0». Когда я проверяю выбор «Нет» в первом chekboxGroupInput, количество появлений отображает «4»: хорошо, а если я проверяю выбор «Возможно» во втором chekboxGroupInput, количество вхождений равно «2»: хорошо. Но если я сниму флажок «Возможно», число появлений будет «0» вместо возврата «4», как раньше. Когда я проверяю, все в порядке, но если снять галочку, число случаев падает до «0», и я не понимаю, почему. Поскольку в моем фрейме данных есть десятки переменных, у меня будет столько же chekboxGroupInputs, сколько и переменных, поэтому, если вы знаете лучший способ сделать это, пожалуйста, сообщите мне. Большое спасибо за любую помощь. Это воспроизводимый пример моей программы:

 library(dplyr)
 library(shiny)

 ui <- fluidPage(
   fluidRow(
     column(3,
            checkboxGroupInput("variable1", "Occurences of column A :",
                               c("Yes (1)" = "1",
                                 "No (2)" = "2",
                                 "Perhaps (0)" = "0")),
            checkboxGroupInput("variable2", "Occurences of column B :",
                               c("Yes (1)" = "1",
                                 "No (2)" = "2",
                                 "Perhaps (0)" = "0")),
            checkboxGroupInput("variable3", "Occurences of column C :",
                               c("Yes (1)" = "1",
                                 "No (2)" = "2",
                                 "Perhaps (0)" = "0"))),

     column(3,
            tableOutput("data")),

     column(3,
            textOutput("result"))
     )
   )

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

   result <- 0

   observe({input$variable1

     output$result <- renderText({

       df1 <- filter(data_test, A %in% input$variable1)

       assign("df1", df1, envir = .GlobalEnv)

       result <- paste("Number of occurences = ", NROW(df1))

       })

     })

   observe({input$variable2

     if (is.null(input$variable2)){

       result <- paste("Number of occurences = ", NROW(df1))}

     else {

       output$result <- renderText({

         df2 <- filter(df1, B %in% input$variable2)

         assign("df2", df2, envir = .GlobalEnv)

         result <- paste("Number of occurences = ", NROW(df2))

         })

     }

     })

   observe({input$variable3

     if (is.null(input$variable3)){

       result <- paste("Number of occurences = ", NROW(df2)) }

     else {

       output$result <- renderText({

         df3 <- filter(df2, C %in% input$variable3)

         assign("df3", df3, envir = .GlobalEnv)

         result <- paste("Number of occurences = ", NROW(df3))

         })

     }

     })

   output$data <- renderTable({data_test})

 }

 shinyApp(ui, server)

1 Ответ

0 голосов
/ 17 апреля 2020

Я создал пример, который работает ниже. Я сделал df a reactive (что означает, что он должен вызываться с df()), и собрал все фильтры вместе. is.null(input$variable1) необходим, потому что (я предполагаю) вы хотите все строки, если ничего не выделено.

library(dplyr)
library(shiny)
PC<-c('001','002','003','004','005','006','007','008','009','010')
A<-c('2','2','1','1','2','0','2','0','1','0')
B<-c('0','2','0','0','1','0','0','0','1','0')
C<-c('1','0','0','0','2','2','0','0','0','1')
D<-c('1','0','1','1','0','2','1','1','2','2')
E<-c('0','0','0','2','2','0','0','0','0','2')
F<-c('0','1','1','1','0','0','2','0','0','0')
data_test <- data.frame(PC, A, B, C, D, E, F)

ui <- fluidPage(
  fluidRow(
    column(3,
           checkboxGroupInput("variable1", "Occurences of column A :",
                              c("Yes (1)" = "1",
                                "No (2)" = "2",
                                "Perhaps (0)" = "0")),
           checkboxGroupInput("variable2", "Occurences of column B :",
                              c("Yes (1)" = "1",
                                "No (2)" = "2",
                                "Perhaps (0)" = "0")),
           checkboxGroupInput("variable3", "Occurences of column C :",
                              c("Yes (1)" = "1",
                                "No (2)" = "2",
                                "Perhaps (0)" = "0"))),

    column(3,
           tableOutput("data")),

    column(3,
           textOutput("result"))
  )
)

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

  result <- 0

  df1 <- reactive({
    filter(data_test,
           (is.null(input$variable1) | A %in% input$variable1),
           (is.null(input$variable2) | B %in% input$variable2),
           (is.null(input$variable3) | C %in% input$variable3))
  })

  output$result <- renderText(paste("Number of occurences = ", nrow(df1())))


  output$data <- renderTable({df1()})

}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...