Передача данных и ввод в блестящем приложении - PullRequest
0 голосов
/ 10 сентября 2018

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

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 голосов
/ 10 сентября 2018

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

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

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

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