Отображение подмножества фрейма данных в приложении Shiny - PullRequest
1 голос
/ 23 февраля 2020

Новичок в Shiny, я пытаюсь создать очень простое приложение с учетом следующей последовательности событий:

(1) Загрузить фрейм данных,

(2) Дождаться, пока пользователь установит параметр фильтрации (Category в приведенном ниже примере),

(3) Нажмите кнопку Go!,

(4) Отобразите первые строки фрейма подмножества данных.

Допустим, у меня есть файл df.tab для загрузки и обработки.

df <- data.frame(Category=c("A","A","A","B","B","B"), X=c(1,2,3,1,2,3), Y=c(1,2,3,34,21,1))
df
  Category X  Y
1        A 1  1
2        A 2  2
3        A 3  3
4        B 1 34
5        B 2 21
6        B 3  1
write.table(df, file="df.tab", row.names=F, quote=F, sep="\t")

Мой app.R выглядит так:

library(shiny)

# Define UI ----
ui <- fluidPage(

    sidebarLayout(
        sidebarPanel(
            fileInput("input_df",label=h4("Dataset")),

            selectInput("category",h4("Category"), choices = list("A" = 1,"B" = 2),selected = 1),

            actionButton("goButton",label = "Go!")  
        ),

        mainPanel(
            tableOutput("view")
        )
    )
)

# Define server logic ----
server <- function(input, output) {

    data <- eventReactive(
        input$input_df,
        {
            File <- input$input_df

            if(is.null(File)){
                return(NULL)
            }else{
                df <- read.table(File$datapath, header = T, sep = "\t")
            }
        }
    )

    data_sub <- eventReactive(
        input$category,
        {   
            df_sub <- subset(data(), Category == input$category)
        }
    )

    output$view <- renderTable(
        {
            head(data_sub())
        }
    )
}

# Run the app ----
shinyApp(ui = ui, server = server)

Однако приложение либо не реагирует или не отображает строки.

Обратите внимание, что я создал 2 различных реактивных события data и data_sub, чтобы избежать загрузки файла каждый раз, когда я выбираю другую категорию (и, возможно, чтобы избежать ошибок стека) с рекурсивной функцией).

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 февраля 2020

Вот рабочая server функция. Используйте reactive, а не eventReactive, и это довольно просто.

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

# Define server logic ----
server <- function(input, output) {

  dataset <- reactive({

      File <- input$input_df
      req(File)

      read.table(File$datapath, header = TRUE, sep = "\t")
  })

  data_sub <- reactive({
    if("Category" %in% names(dataset())){
      subset(dataset(), Category == input$category)
    } else {
      dataset()
    }
  })

  output$view <- renderTable({
      head(data_sub())
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...