2015-07-10 4 views
6

Ho un pulsante HTML in lucido che se cliccato, chiama la funzione JavaScript geocodeAddressStreet(...) in un file .js nella /www directory:Come posso ottenere un pulsante in Shiny per chiamare sia il codice JavaScript che il codice R in parallelo?

tags$body(tags$input(type = "button", 
        value = "Next", 
        id = "button1", 
        onClick = "geocodeAddressStreet(houseNumber,streetName,addressCity,addressState)"))), 

Comunque io non riesco a capire come ottenere questo pulsante per chiamare un secondo file quando cliccato, diciamo foo.R. Entrambe le procedure funzionano in modo indipendente, ma sembra che non sia possibile aggiungere un elemento inputId a un elemento HTML in Shiny. Al momento abbiamo due pulsanti diversi, uno dei quali chiama il codice R e l'altro chiama il codice JavaScript, ma questa è chiaramente una soluzione poco pratica.

+0

In 'server.r' non puoi semplicemente impostare un' observ() 'che chiamerà lo script quando si fa clic sul pulsante? –

+0

Non hai bisogno di un 'inputId'? Questo pulsante ha solo un ID HTML standard per quanto posso dire. –

+0

Cosa c'è che non va nella funzione brillante 'actionButton' standard? – nicola

risposta

6

Quindi si desidera avere un pulsante e quando si fa clic, viene chiamata una funzione javascript e un codice R? Sono stato in grado di fare questo con la funzione onclick dal shinyjs package (disclaimer: ho scritto il pacchetto)

library(shinyjs) 

jsCode <- " 
shinyjs.geocodeAddr = function(params) { 
    alert('JavaScript called!'); 
    // geocodeAddressStreet(...) 
} 
" 

runApp(shinyApp(
    ui = fluidPage(
    useShinyjs(), 
    extendShinyjs(text = jsCode), 
    actionButton("btn", "Click me") 
), 
    server = function(input, output, session) { 
    onclick("btn", { 
     js$geocodeAddr() 
     cat("R called as well") 
    }) 
    } 
)) 

In sostanza, la funzione onclick è una funzione R che verrà eseguito quando il pulsante viene premuto. All'interno di esso è ovviamente possibile chiamare facilmente il codice R, ma è anche possibile chiamare il codice JS utilizzando il pacchetto shinyjs - è così che ho effettuato una chiamata a js$geocodeAddr. Guarda la funzione extendShinyjs. In alternativa, invece di utilizzare extendShinyjs(), puoi anche utilizzare il solito approccio di session$sendCustomMessage(...)

+0

Grazie! Sto per provarlo. Come posso fare questo pur mantenendo il JavaScript in un file separato però? Come invece di jsCode <- "(codice javaScript)", quindi jsCode <- load (blah.js) –

+0

'extendShinyjs (script =" percorso/a/js ")' invece del parametro 'text'. Da qui il mio suggerimento "Guarda la funzione' extendShinyjs' - leggi la sua documentazione, ci vorranno 5 minuti, ma potrebbe semplificarti la vita:) (si spera) –