在闪亮的应用程序中传递数据和输入

时间:2018-09-10 09:14:17

标签: r shiny

我正在尝试简化我的闪亮应用程序。但是,正如我所希望的那样,在我尝试的所有过程中,它都无法正常工作。 我的想法是将数据加载到应用程序,执行一些分析并将中间结果返回给用户。目前,我必须加载数据,为要生成的每个输出选择合适的列等:

ui <- shinyServer(
  fluidPage(
    tabsetPanel(

      tabPanel("Data upload",
               titlePanel("Data upload"),
               sidebarLayout(
                sidebarPanel(
                  fileInput("file1", "Choose CSV File",multiple = TRUE, accept = c("text/csv","text/comma-separated-values,text/plain",".csv")),
                  tags$hr(),
                  checkboxInput("header", "Header", TRUE), radioButtons("sep", "Separator", choices = c(Comma = ",", Semicolon = ";",Tab = "\t"), selected = ","),
                  tags$hr(),
                  checkboxInput("disp", "Display",TRUE),
                  tags$hr(),

                  uiOutput("choose_first_column"),
                  uiOutput("choose_second_column"),
                  br()

                ),
                mainPanel(
                  tableOutput("contents"),
                  tags$hr(),
                  tableOutput("tab")
                  )
               )
          ),
        tabPanel("2","2"
    )  

)
)
)


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

  observe({

    req(input$file1)

    df <-  read.csv(input$file1$datapath,
                   header = input$header,
                   sep = input$sep,
                   quote = input$quote)

    output$contents <- renderTable({
                      (head(df))})

    output$choose_first_column <- renderUI({
        colnames <- names(df)
        selectInput("column_1", "Choose Date column", 
                choices  = colnames,
                selected = colnames)})

    output$choose_second_column <- renderUI({
        colnames <- names(df)
        selectInput("column_2", "Choose Variable column", 
                choices  = colnames,
                selected = colnames)})

    output$tab <- renderTable({         

        req(input$file1)

        df2 <-  read.csv(input$file1$datapath,
                       header = input$header,
                       sep = input$sep,
                       quote = input$quote)

        df2 <- df2[, c(input$column_1,input$column_2), drop = FALSE]    

        return(head(df2))})

  })
  })  

runApp(list(ui = ui, server = server))

它可以工作,但是由于我通常有很多数据,并且我想执行一些分析,因此加载和处理每个“输出内容”的数据非常耗时。 有办法避免这种情况吗?例如,是否可以像第二个示例一样加载数据并选择正确的全局列? (我划掉了发生错误的地方)

ui <- shinyServer(
  fluidPage(
    tabsetPanel(

      tabPanel("Data upload",
               titlePanel("Data upload"),
               sidebarLayout(
                sidebarPanel(
                  fileInput("file1", "Choose CSV File",multiple = TRUE, accept = c("text/csv","text/comma-separated-values,text/plain",".csv")),
                  tags$hr(),
                  checkboxInput("header", "Header", TRUE), radioButtons("sep", "Separator", choices = c(Comma = ",", Semicolon = ";",Tab = "\t"), selected = ","),
                  tags$hr(),
                  checkboxInput("disp", "Display",TRUE),
                  tags$hr(),

                  uiOutput("choose_first_column"),
                  uiOutput("choose_second_column"),
                  br()

                ),
                mainPanel(
                  tableOutput("contents"),
                  tags$hr(),
                 tableOutput("tab")
                  )
               )
          ),
        tabPanel("2","2"
    )  

)
)
)


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

  observe({

    req(input$file1)

    df <-  read.csv(input$file1$datapath,
                   header = input$header,
                   sep = input$sep,
                   quote = input$quote)

    output$contents <- renderTable({
                      (head(df))})

    output$choose_first_column <- renderUI({
        colnames <- names(df)
        selectInput("column_1", "Choose Date column", 
                choices  = colnames,
                selected = colnames)})

    output$choose_second_column <- renderUI({
        colnames <- names(df)
        selectInput("column_2", "Choose Variable column", 
                choices  = colnames,
                selected = colnames)})

#   df <- df[, c(input$column_1,input$column_2), drop = FALSE]  
#               
#   output$tab <- renderTable({
#                      (head(df))})

  })
  })  

runApp(list(ui = ui, server = server))

输入数据示例:

date    time    level
01.01.2000  00:00:00    0.3724
01.01.2000  01:00:00    0.192
01.01.2000  02:00:00    -0.0252

我将不胜感激! 艾雪

1 个答案:

答案 0 :(得分:0)

据我了解,您收到一个错误消息,因为您定义的数据帧df没有反应。您应该使其具有反应性,因为每次用户选择输入列时它都会改变。

请参阅this以了解反应性。将代码的已删除部分更改为此:

df.selected.columns <- df[c(input$column_1,input$column_2)]  

output$tab <- renderTable({
                      (head(df.selected.columns()))
              })