2017-09-02 5 views
2

Ich versuche eine kleine glänzende App, wobei ich eine CSV-Datei aus dem lokalen Verzeichnis lade und dann bestimmte Spalten aus dem Datenrahmen auswähle und diesen Teildatensatz zur weiteren Datenanalyse verwende.Shiny Wie dynamisch Spalten des importierten Datensatzes zur weiteren Analyse ausgewählt werden können

library(shiny) 

# Define UI for application that draws a histogram 
ui <- fluidPage(

    # Application title 
    titlePanel("Old Faithful Geyser Data"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
     sidebarPanel(
     fileInput("dataset", "Choose CSV File", 
        multiple = TRUE, 
        accept = c("text/csv", 
          "text/comma-separated-values,text/plain", 
          ".csv")), 
     # Include clarifying text ---- 
     #helpText(em("Note: This app requires file in csv format only!!")), 
     helpText(em("Note:Select all the inputs and click on button as given below to exectute the app")), 
     # Input: Checkbox if file has header ---- 
     checkboxInput("header", "Header", TRUE), 
     # Input: Select separator ---- 
     radioButtons("sep", "Separator", 
        choices = c(Comma = ",", 
           Semicolon = ";", 
           Tab = "\t"), 
        selected = ","), 
     selectInput("select", "Select columns to display", names(datasetInput), multiple = TRUE), 
     actionButton("update", "Update Data set", class = "btn-primary",style='padding:4px; font-size:120%') 
    ), 

     # Show a plot of the generated distribution 
     mainPanel(
     h2('The Mydata'), 
     dataTableOutput('mytable') 
    ) 
    ) 
) 

# Define server logic required to draw a histogram 
server <- function(input, output) { 

    datasetInput <- eventReactive(input$update, { 
    validate(need(input$dataset != "", "Please select a data set in csv format only!!!"))# custom error message on opening the app 
    read.csv(input$dataset$datapath, 
      header = input$header, 
      sep = input$sep) 
    }, ignoreNULL = FALSE) 

    dataset <- reactive({ 
    df_input<-datasetInput() 
    df_input$x<-NULL 
    df_input 
    }) 

    output$mytable = renderDataTable({ 
    columns = names(dataset) 
    if (!is.null(input$select)) { 
     columns = input$select 
    } 
    dataset[,columns,drop=FALSE] 
    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server) 

In einigen SO Antworten suchen, bekam ein paar; eine wie unten angegeben:

shiny allowling users to choose which columns to display

Aber diese Antwort ist der Datensatz vordefinierte; Ich möchte dem Benutzer seinen eigenen Datensatz herunterladen.

ich die folgende Störung erhalte:

Error in lapply(obj, function(val) { : object 'datasetInput' not found

ich irgendwo denke ich, eine observeEvent Funktion verwenden?

+0

Der Fehler tritt aufgrund des 'choices' Argument der' selectInput' zu bekommen. 'datasetInput' existiert nicht, während die Benutzeroberfläche der App gerendert wird. –

+0

@Imran Ali Ich weiß .... muss wissen, wie kann ich die hochgeladene CSV-Datei verbinden und die Spalten der hochgeladenen Datei anzeigen ..... Was die ID ID im 'selectInput' Argument – Nishant

+0

shud sein, müssen Sie dynamisch 'renderUI'. [Dynamischer selectInput in R shiny] (https://stackoverflow.com/questions/34080629/dynamic-selectinput-in-r-shiny) könnte Ihnen beim Einstieg helfen. –

Antwort

4

Hier ist eine Variante von server.R; benutze es mit akruns ui.R. Dieser passt die Filteroptionen dynamisch an und ermöglicht es Ihnen, Spalten hinzuzufügen, indem Sie deren Spaltennamen hinzufügen, auch nachdem Sie auf die Schaltfläche geklickt haben.

library(shiny) 
library(DT) 

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

    data <- reactive({ 
    req(input$dataset) 
    read.csv(input$dataset$datapath, header = input$header,sep = input$sep) 
    }) 

    filtereddata <- eventReactive({ 
     input$update 
     data() 
    }, { 
    req(data()) 
    if(is.null(input$select) || input$select == "") 
     data() else 
     data()[, colnames(data()) %in% input$select] 
    }) 

    observeEvent(data(), { 
    updateSelectInput(session, "select", choices=colnames(data())) 
    }) 

    output$mytable <- renderDataTable(filtereddata()) 

} 
2

konnten wir ändern es

library(shiny) 
library(DT) 

-ui

ui <- fluidPage(

    # Application title 
    titlePanel("Old Faithful Geyser Data"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
    sidebarPanel(
     fileInput("dataset", "Choose CSV File", 
       multiple = TRUE, 
       accept = c("text/csv", 
          "text/comma-separated-values,text/plain", 
          ".csv")), 
     # Include clarifying text ---- 
     #helpText(em("Note: This app requires file in csv format only!!")), 
     helpText(em("Note:Select all the inputs and click on button as given below to exectute the app")), 
     # Input: Checkbox if file has header ---- 
     checkboxInput("header", "Header", TRUE), 
     # Input: Select separator ---- 
     radioButtons("sep", "Separator", 
        choices = c(Comma = ",", 
           Semicolon = ";", 
           Tab = "\t"), 
        selected = ","), 
     selectInput("select", "Select columns to display", c('col1', 'col2'), multiple = TRUE), 
     actionButton("update", "Update Data set", class = "btn-primary",style='padding:4px; font-size:120%') 
    ), 

    # Show a plot of the generated distribution 
    mainPanel(
     h2('The Mydata'), 
     #tableOutput("mytable") 
     DT::dataTableOutput("mytable") 

    ) 
) 
) 

-Server

server <- function(input, output) { 

    values <- reactiveValues(df_data = NULL) 
    observeEvent(input$dataset, { 
     values$df_data <- read.csv(input$dataset$datapath, 
           header = input$header, 
           sep = input$sep 
           )} 

       ) 
    observeEvent(input$update, { 
    temp <- values$df_data[input$select] 
    values$df_data <- temp 

    }) 
    output$mytable <- renderDataTable(values$df_data) 

} 

-Run die Anwendung

shinyApp(ui = ui, server = server) 

-Ausgang

enter image description here

-nach

Aktualisierung

enter image description here

+0

Fast dort ,,, ur die Spaltennamen nicht dynamisch in 'selectInput' Funktion als ur ausdrücklich definierenden Spaltennamen des importierten Datasets aufrufen ..... es funktioniert nicht für irgendwelche anderen Datasets ...... so was das Argument scheuen sei anstelle von 'c ('col1', 'col2')' ..... – Nishant

0

@Christoph Wolk ..... exzellent es funktioniert!

Nur eine kleine Änderung .... da ich mag nicht so schnell die Daten zeigen, es ausgewählt ist Navigation mit aber nur, wenn update data set Schaltfläche geklickt wird i auf Kommentar outdata() wie unten“

filtereddata <- eventReactive({ 
    input$update 
    #data() 
    }, { 
    req(data()) 
     if(is.null(input$select) || input$select == "") 
     data() else 
     data()[, colnames(data()) %in% input$select] 
    }) 

    observeEvent(data(), { 
    updateSelectInput(session, "select", choices=colnames(data())) 
    }) 

Ist es eine Möglichkeit, eine benutzerdefinierte Nachricht anstelle von leeren im Hauptfenster angezeigt wird, wenn die App geöffnet wird, etwa wie folgt:

Please select a data set in csv format only

Irgendwo müssen wir eine Art Zustand gebracht i ich nehme an n oben filtereddata():

validate(need(input$dataset != "","Please select a data set in csv format only!!!"))# custom error message on opening the app

es gelöst !!!!!

filtereddata <- eventReactive({ 
    validate(need(input$dataset != "","Please select a data set in csv format only!!!"))# custom error message on opening the app 
    input$update 
    #data() 
    }, { 
     req(data()) 

    if(is.null(input$select) || input$select == "") 
     data() else 
     data()[, colnames(data()) %in% input$select] 
    }) 

in ui

hinzufügen, um diese benutzerdefinierten Farbe für den Fehler msg

# Custom error message with green colour ---- 



tags$head(
    tags$style(HTML(" 
        .shiny-output-error-validation { 
        color: green; 
        } 
        "))) 

enter image description here

Verwandte Themen