2016-09-22 81 views
0

我正在使用閃亮(R)構建應用程序。在開始時,用戶可以上傳要使用的文件(我正在進行排序數據分析)。我的目標是能夠在不知道該文件有多少列的情況下使用文件,以及數據的外觀如何。使用輸入在Shiny R中創建UI

所以現在我不得不選擇由數列,我給這個小預覽應用程序選擇列,然後旁邊,原來顯示它們:

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) 

現在我想能根據標題選擇要使用的列。

它感覺不自然:在運行時更改應用程序..但在反應環境中..爲什麼不呢?

問題:如何在其已經運行的情況下更改UI,其中的值來自輸入?

親切的問候,彼得

+0

這是越來越downvoted主要是因爲你是不是簡潔有關的問題是,究竟是什麼。我認爲你需要嘗試一些類似於「如何更改正在運行的Shiny文本框中的項目?」。將問題分解到其組成部分,並就每個部分提出一個簡潔的問題。 –

+0

@JDLong好的,感謝您的評論。我會更新這個問題,就像Carl Boneri給出的答案一樣,我認爲它對未來更多的人仍然有用。 – Piet93

+0

我希望它是更好的知道,請讓我知道。 – Piet93

回答

1

讓我覺得不適合回答這個骯髒......我沒有調試或妥善處理reactives。但在這裏你走了。您需要響應在服務器端上傳的文件,提取列名稱,並將選項追加到選擇輸入中,然後作爲列過濾器傳遞給表函數。

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) 

}