在Shiny应用程序中显示数据框的子集

时间:2020-02-23 18:03:52

标签: shiny

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个不同的反应性事件datadata_sub,以避免每次我选择其他类别时都加载文件(并可能避免使用递归函数引起的堆栈错误)。 / p>

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是一个有效的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())
  })
}