2015-07-10 4 views
6

ich eine HTML-Schaltfläche in Shiny habe, dass, wenn darauf geklickt, die JavaScript-Funktion geocodeAddressStreet(...) in einer .js Datei im /www Verzeichnis ruft:Wie kann ich eine Schaltfläche in Shiny erhalten, um JavaScript und R-Code parallel aufzurufen?

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

Allerdings kann ich nicht herausfinden, wie man diese Taste, um eine zweite Datei zu rufen, wenn geklickt, sagen wir foo.R. Beide Verfahren laufen unabhängig voneinander, aber es scheint, als ob es keine Möglichkeit gibt, ein inputId HTML-Element in Shiny hinzuzufügen. Wir haben derzeit zwei verschiedene Schaltflächen, von denen einer den R-Code aufruft und der andere JavaScript-Code aufruft, aber dies ist eindeutig eine unpraktische Lösung.

+0

In 'server.r' verwenden können Sie nicht nur ein' beobachten() 'einrichten, die das Skript aufrufen, wenn die Schaltfläche geklickt wird? –

+0

Brauchen Sie nicht eine 'inputId'? Diese Schaltfläche hat, soweit ich weiß, nur eine Standard-HTML-ID. –

+0

Was stimmt nicht mit der standardmäßigen "actionButton" -Show-Funktion? – nicola

Antwort

6

Sie wollen also eine Schaltfläche haben und wenn Sie darauf klicken, werden sowohl eine Javascript-Funktion als auch ein R-Code aufgerufen? Ich konnte dies aus dem shinyjs Paket mit der onclick Funktion tun (Disclaimer: Ich habe das Paket geschrieben)

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") 
    }) 
    } 
)) 

Grundsätzlich ist die onclick Funktion eine R-Funktion, die ausgeführt wird, wenn die Schaltfläche geklickt wird. Darin können Sie ganz einfach R-Code aufrufen, aber Sie können den JS-Code auch mit dem shinyjs-Paket aufrufen - so habe ich einen Anruf an js$geocodeAddr getätigt. Sehen Sie sich die extendShinyjs Funktion an. Alternativ kann anstelle extendShinyjs() zu verwenden, können Sie auch die übliche Vorgehensweise von session$sendCustomMessage(...)

+0

Danke! Ich bin dabei, das zu versuchen. Wie kann ich dies tun, während ich das JavaScript in einer separaten Datei halte? Wie statt jsCode <- "(javaScript code)", also jsCode <- load (blah.js) –

+0

'extendShinyjs (script =" pfad/zu/js ")' anstelle des 'text' Parameters. Daher mein Vorschlag "Sieh dir die' extendShinyjs' Funktion an - lies ihre Dokumentation, es dauert 5 Minuten, aber könnte dein Leben einfacher machen:) (hoffentlich) –

Verwandte Themen