2016-09-20 2 views
0

Ich habe eine glänzende Anwendung, die 2 Registerkarten enthält. In der zweiten Registerkarte führe ich eine SQL-Abfrage aus, um einen Datenrahmen zurück zu bekommen, den ich auf dem Bildschirm veröffentlichen möchte, damit der Benutzer sehen kann. Der Kürze halber habe ich nur den relevanten Code eingefügt. Grundsätzlich wählt der Benutzer einen Datumsbereich aus, dieser geht zur Datenbank und zieht die relevanten Informationen und gibt diese Informationen an den Server zurück, um sie auf dem Bildschirm zu veröffentlichen. Zur Zeit laufen, wenn die App erhalte ich die FehlermeldungR glänzend, kann die Funktion nicht finden

Error: could not find function "report_data"

ich für jede Hilfe dankbar sein würde Sie

#----------------------------------------------------------------------------------------- 
# UI  
# TAB 2 which lets the user select a date range and press the submit button 
#----------------------------------------------------------------------------------------- 
tabPanel("Review Uploaded Data", 
        # Side Panel with Options 
        fluidRow(
        column(4, wellPanel(
         id = "leftPanel", 

         div(id = "Header", 
          h3("Options", align = "center"), 
          tags$hr() 
        ), 

         div(id = "form2", 

          dateRangeInput("dates", label = h3("Entry Date Range")), 
          actionButton("search", "Search Database", class = "btn-primary") 

        ) 
        )), 

        column(8, id = "reporttable", 
          # Main Panel shows the uploaded excel document when a user first uploads 
          DT::dataTableOutput("reportTable") 

        ))) 


#----------------------------------------------------------------------------------------- 
# Server  
# TAB 2 Review Uploaded Data 
#----------------------------------------------------------------------------------------- 


# When User selects a date Range. Run the SQL to pull information for that Date Range 
report_data <- observeEvent(input$search, { 
    load_data(input$dates) 
}) 

# Show the summary table 
output$reportTable <- DT::renderDataTable(
    DT::datatable(
    report_data(), 
    rownames = TRUE, 
    options = list(searching = FALSE, lengthChange = FALSE, scrollX = FALSE) 
)) 

Diese Funktion ist die Funktion, die auf die Datenbank geht liefern könnten und gibt den Datenrahmen basierend auf die Benutzerauswahl eines Datumsbereichs.

# Load the data from the MYSQL table 
load_data <- function(dateRange) { 
    # Connect to the database 
    db <- dbConnect(MySQL(), dbname = databaseName, host = options()$mysql$host, 
       port = options()$mysql$port, user = options()$mysql$user, 
       password = options()$mysql$password) 


    start_date <- dateRange[1] 
    end_date <- dateRange[2] 

    # Construct the fetching query 
    query <- sprintf("SELECT USER, COUNT(*) as records FROM %s 
WHERE ENTRY_DATE BETWEEN '%s' AND '%s' GROUP BY 1", table, start_date,  end_date) 

    # Submit the fetch query and disconnect 
    data <- dbGetQuery(db, query) 
    dbDisconnect(db) 
    names(data) <- c("User", "records") 

    return(data) 
} 
+4

verwenden Sie müssen 'eventReactive' statt' observeEvent' weil observeEvent - nichts zurückgeben – Batanichek

+0

Vielen Dank, ich kratzte mich seit Ewigkeiten darüber. Bitte stellen Sie es als Antwort und ich werde es sofort markieren –

Antwort

1

Es gibt einige Unterschiede zwischen eventReactive und observeEvent

Einer der wichtigen (meiner Meinung nach), dass observeEvent nicht Werte zurückgeben

wie in Hilfe gesagt:

Use observeEvent whenever you want to perform an action in response to an event. (Note that "recalculate a value" does not generally count as performing an action–see eventReactive for that.)

Use eventReactive to create a calculated value that only updates in response to an event.

So können Sie verwenden Sie einfach eventReactive

report_data <- eventReactive(input$search, { 
    load_data(input$dates) 
}) 

Oder erstellen reactiveValues und ändern Sie es in observeEvent (manchmal ist es besser - wenn die Bedingung nicht einfach)

report_data <- reactiveValues(data_1=NULL) 
observeEvent(input$search, { 
    report_data$data_1<-load_data(input$dates) 
}) 

und dann report_data$data_1