2016-08-16 4 views
0

Ich bin sehr neu in Reaktivität, im Zusammenhang mit der Verwendung von R/Shiny als GIS ..Gibt es eine Möglichkeit, reaktive Ausdrücke in Shiny zu kombinieren?

Ist es möglich, eine reaktive Variable, die sich ändern, wenn einer von zwei verschiedenen reaktiven Ausdrücke ausführen wird?

Grundsätzlich kann der Benutzer entweder manuell einen Datenrahmen erstellen oder einen hochladen. Problem ist, dass ich alle reaktiven Ausdrücke mit der Seite der manuellen Erstellung (customDF()) verknüpft habe und die Upload-Seite nicht integrieren kann.

Mit anderen Worten, möchte ich das Programm erkennen, dass ein Datenrahmen geändert hat, wenn ich eine der beiden Tasten (Erstellen von Datenrahmen und Upload). Ich habe versucht, einer der beiden Ausdrücke eine statische Variable zuzuweisen, aber es hat die Reaktivität zerstört.

Hier ist, was die Tastendruck-Methode wie folgt aussieht:

customDF <- eventReactive(input$buildTable,{ 

    p <- getPoly() 
    a <- attrib() 

    for(i in 1:length(activeLayers)){ 
     word <- activeLayers[i] 
     p[[word]] <- with(a, a[[word]][match(p$geoid, a$geoid)]) 
    } 
    p 
    }) 

# Method that uses it 
exportResult <- eventReactive(input$export, {   
    j <- customDF() 
    writeSpatialShape(j, paste(repoLocation,input$layerName, sep="")) 

    "Export successful" 
    }) 

importResult <- eventReactive(input$selectImport, { 
    # ?????? 
    }) 

Jede Hilfe wäre sehr dankbar.

Antwort

0

in Datei importieren und Datei auswählen? aus angepasst: https://gist.github.com/jcheng5/9496297

server.r

#list of files 
files <<- ("create data frame" = "create", 
      "upload data frame" = "upload") 

#cash results 
getData <- memoise(function(file){ 
    if (!(file %in% files)) 
     stop("Unknown File") 

    data<- as.data.frame(sprintf("path///to///file///location//%s.csv", file)) 

    data 
    }) 

#reactive function 
shinyServer(function(input, output, session) { 
    # Define a reactive expression for the document 
    reactiveData <- reactive({ 
    # Change when the "update" button is pressed... 
    input$update 
    # ...but not for anything else 
    isolate({ 
     withProgress(session, { 
     setProgress(message = "Processing data...") 
     getData(input$selection) 
     }) 
    }) 
    }) 


#output as table or whatever 
output$table <- DT::renderDataTable(DT::datatable(
        data <- as.data.frame(reactiveData()) 
       ) 

ur.r

shinyUI(fluidPage(
    progressInit(), 

    # Application title 
    headerPanel("data selection"), 

    # Sidebar with a slider and selection inputs 
    sidebarPanel(width = 5, 
    selectInput("selection", "Choose a dataset:", 
       choices = files), 
    actionButton("update", "Change"), 

), 

    # Show data 
    mainPanel(
    DT::dataTableOutput("table") 
) 
)) 
Verwandte Themen