Передача данных и ввод в блестящем приложении

Я пытался упростить свое блестящее приложение. Однако, как бы я ни старался, это не работает, как хотелось бы. Моя идея заключалась в том, чтобы загрузить данные в приложение, выполнить некоторый анализ и вернуть пользователю промежуточные результаты. На данный момент мне нужно загрузить данные, выбрать правильные столбцы и т. д. Для каждого генерируемого мной вывода:

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
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько я понял, вы получаете сообщение об ошибке, потому что df фрейма данных, который вы определили, не является реактивным. Вы должны сделать его реактивным, так как он будет меняться каждый раз, когда пользователь выбирает входные столбцы.

Обратитесь к это, чтобы узнать о реактивности. Измените удаленную часть вашего кода на это:

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

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

Другие вопросы по теме