Как я могу установить подмножество моего информационного кадра на основе ввода флажка в блестящем приложении? - PullRequest
0 голосов
/ 16 мая 2019

Я работаю над блестящим приложением, я пытаюсь отфильтровать информационный фрейм на основе ввода флажка, то есть, если установить этот флажок, информационный фрейм фильтруется, иначе фрейм данных остается прежним. Если флажок установлен, в столбце «CANONICAL» должны быть выбраны только те строки со значением «YES»

Я читал похожие вопросы (например, здесь: Фильтр условий в dplyr на основе блестящего ввода ), но я не смог решить мой.

Мой код выглядит следующим образом:

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

options(shiny.maxRequestSize = 100*1024^2)

ui <- fluidPage(

  sidebarLayout(

    sidebarPanel(
      fileInput("file1", "Upload your File",
                multiple = FALSE,
                accept = c("text/csv",
                           "text/comma-separated-values,text/plain",
                           ".csv")),

      pickerInput("Consequence", "Consequence:",   
                  choices = c( "x", "y","z"), 
                  options = list(`actions-box` = TRUE),
                  multiple = TRUE ),
      prettyCheckbox(inputId= "CANONICAL", label = "CANONICAL", value =              FALSE, outline= TRUE, fill = TRUE, bigger = TRUE, status = 'success',width = NULL),

    mainPanel(
      dataTableOutput("contents")
    )

  ))

server <- function(input, output) {

  output$contents <- renderDT({
    req(input$file1)
    df <- read.delim(input$file1$datapath,
                     header = TRUE,
                     sep = '\t') 

    # Apply filters 
    df <- df %>% 
    filter(Consequence == input$Consequence ) %>%
    { if (input$CANONICAL) filter( CANONICAL == 'YES') }

return(df)

shinyApp(ui, server) 

Последний фильтр не работает, если условие (input$CANONICAL), (input$CANONICAL == TRUE) или (!is.null(input$CANONICAL)). Я также пытался определить условие в отдельной реактивной функции, но, похоже, ничего не работает.

1 Ответ

1 голос
/ 16 мая 2019

Пожалуйста, попробуйте в следующий раз добавить воспроизводимый пример с чистым кодом r.

В текущей форме вы не можете использовать условие if после оператора pipe.

Я обычно добавляю условие if в оператор фильтра. Смотрите код ниже. В этом случае вы должны указать условие else, иначе код не будет работать.

Обратите внимание, что я изменил ваш пример, чтобы сделать его воспроизводимым.

library("shiny")
library(DT)
library(dplyr)
library(shinyWidgets)

## Only run examples in interactive R sessions

shinyApp(

    # options(shiny.maxRequestSize = 100*1024^2)

    ui = fluidPage(

        sidebarLayout(

            sidebarPanel(

                pickerInput("Consequence", "Consequence:",   
                            choices = c( "x", "y","z"), 
                            options = list(`actions-box` = TRUE),
                            selected = "x",
                            multiple = TRUE ),

                prettyCheckbox(inputId = "CANONICAL",
                               label = "CANONICAL",
                               value = FALSE,
                               outline = TRUE,
                               fill = TRUE,
                               bigger = TRUE,
                               status = 'success',width = NULL)),


            mainPanel(
                dataTableOutput("contents")
            )

            )
        ),

        server = function(input, output) {

            df <- data.frame(Consequence = c(rep("x",4),rep("y",4),rep("z",4)),
                          CANONICAL = rep(c("YES","NO"),6),
                             x1 = c(5,6,7,3,4,5,2,3,4,2,1,7),
                             x2 = c(1,2,3,2,3,2,1,4,6,7,3,4),
                             x3 = c(12,43,64,34,93,16,32,74,84,89,45,67)
                          )


            output$contents <- renderDT({

                print(input$CANONICAL)

            df <- df %>% 
                filter(Consequence == input$Consequence ) %>%
                filter(if (input$CANONICAL == TRUE) CANONICAL == "YES" else !is.na(CANONICAL))

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