2016-09-22 5 views
0

Я создаю приложение в блестящем (R). Вначале пользователь может загрузить файл для использования (я делаю анализ данных сортировки). Моя цель - использовать файлы, не зная, сколько столбцов имеет этот файл, и как точно выглядят данные.Использование ввода для создания пользовательского интерфейса в Shiny R

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

library(shiny) 

ui <-fluidPage(
    headerPanel("Select data"), 
    sidebarLayout(
sidebarPanel(
    fileInput("uploadFile", "XLSX file"), 

    textInput('vec1', 'Choose training columns', "3,4"), 
    actionButton("choose","choose data") 
), 
mainPanel(
    fluidRow(
    column(6,tableOutput("data_raw")), 
    column(6,tableOutput("data_selected")) 
) 
) 
) 
) 


server <- function(input, output) { 



    output$data_raw <- renderTable({ 

    inFile <- input$uploadFile 
    if (is.null(inFile)) 
    return(NULL) 

    data_raw <<-read.xlsx(inFile$datapath, 1) 
    }) 

    observe({ 
    if(input$choose>0){ 
    selectvec <- as.numeric(unlist(strsplit(input$vec1,","))) 

    output$data_selected <- renderTable(
     data_selected<- data_raw[,selectvec] 
    ) 
    } 
    }) 
    } 


shinyApp(ui,server) 

Теперь я хотел бы быть в состоянии для выбора столбцов для использования на основе их заголовка.

Это неестественно: изменение приложения во время работы ... но в реактивной среде .. почему бы и нет?

ВОПРОС: Как я могу изменить интерфейс, когда он уже запущен, со значениями, исходящими от входа?

Уважением, Pieter

+0

это получение downvoted в основном потому, что вы не лаконичным о том, что речь идет именно. Я думаю, вам нужно попробовать что-то вроде: «Как мне изменить элементы в запущенном текстовом поле Shiny?» Работайте с проблемой до ее составных частей и задайте краткий вопрос о каждой части. –

+0

@JDLong Хорошо, я ценю ваш комментарий. Я уточню вопрос, так как с ответом Карл Бонери я думаю, что он может по-прежнему быть полезен для большего количества людей в будущем. – Piet93

+0

Надеюсь, это лучше знать, пожалуйста, дайте мне знать. – Piet93

ответ

1

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

upload_app <- function(){ 
    library(shiny) 

    ui <- bootstrapPage(
    tags$div(class = "container", 
      column(3, 
        fluidRow(
         fileInput(inputId = 'user_data', 
           label = 'Upload Data (csv)', 
           multiple = FALSE, 
           accept = c(
            'text/csv', 
            'text/comma-separated-values', 
            'text/tab-separated-values', 
            'text/plain', 
            '.csv', 
            '.tsv' 
           )) 
        ), 
        fluidRow(
         uiOutput('column_vars') 
        ) 
      ), 
      column(9, 
        tableOutput('filtered_table')) 
    ) 
) 

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

    var_table <- reactive({ 
     var_data <- input$user_data 
     read.csv(var_data$datapath, header = TRUE,sep = ",", quote = '') 
    }) 

    output$column_vars <- renderUI({ 
     if(!is.null(var_table())){ 
     selectInput(inputId = 'cols', 
        choices = colnames(var_table()), 
        multiple = T, 
        label = "Choose Columns") 
     } 
    }) 

    output$filtered_table <- renderTable({ 

     if(!is.null(var_table())){ 
     if(length(input$cols)>0){ 
      get_these <- input$cols 
      new_table <- var_table()[,c(get_these)] 
     }else { 
      new_table <- var_table() 
     } 

     }else { 
     new_table <- data.frame(data = 'Waiting') 
     } 

     return(new_table) 

    }) 
    } 

    shinyApp(ui, server) 

} 

Смежные вопросы