मैं एक नमूना अनुप्रयोग है कि (मुझे लगता है कि) इस समाधान की पूर्ण क्षमताओं से पता चलता बनाया है और मुझे आशा है कि यह काफी आसान बनाया गया है, कि किसी को भी यह अनुकूलित कर सकते हैं। इनमें से अधिकांश ऐप शो के लिए है, इसलिए कृपया क्षमा करें कि इसमें अप्रासंगिक भाग हैं।
library(leaflet)
library(shiny)
runApp(
shinyApp(
ui = shinyUI(
fluidPage(
# Copy this part here for the Script and disposal-div
uiOutput("script"),
tags$div(id = "garbage"),
# End of copy.
leafletOutput("map"),
verbatimTextOutput("Showcase")
)
),
server = function(input, output, session){
# Just for Show
text <- NULL
makeReactiveBinding("text")
output$Showcase <- renderText({text})
output$popup1 <- renderUI({
actionButton("Go1", "Go1")
})
observeEvent(input$Go1, {
text <<- paste0(text, "\n", "Button 1 is fully reactive.")
})
output$popup2 <- renderUI({
actionButton("Go2", "Go2")
})
observeEvent(input$Go2, {
text <<- paste0(text, "\n", "Button 2 is fully reactive.")
})
output$popup3 <- renderUI({
actionButton("Go3", "Go3")
})
observeEvent(input$Go3, {
text <<- paste0(text, "\n", "Button 3 is fully reactive.")
})
# End: Just for show
# Copy this part.
output$script <- renderUI({
tags$script(HTML('
var target = document.querySelector(".leaflet-popup-pane");
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if(mutation.addedNodes.length > 0){
Shiny.bindAll(".leaflet-popup-content");
};
if(mutation.removedNodes.length > 0){
var popupNode = mutation.removedNodes[0].childNodes[1].childNodes[0].childNodes[0];
var garbageCan = document.getElementById("garbage");
garbageCan.appendChild(popupNode);
Shiny.unbindAll("#garbage");
garbageCan.innerHTML = "";
};
});
});
var config = {childList: true};
observer.observe(target, config);
'))
})
# End Copy
# Function is just to lighten code. But here you can see how to insert the popup.
popupMaker <- function(id){
as.character(uiOutput(id))
}
output$map <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addMarkers(lat = c(10, 20, 30), lng = c(10, 20, 30), popup = lapply(paste0("popup", 1:3), popupMaker))
})
}
), launch.browser = TRUE
)
नोट: एक, आश्चर्य हो सकता है क्यों स्क्रिप्ट सर्वर साइड से जोड़ा जाता है। मुझे सामना करना पड़ा, अन्यथा, EventListener जोड़ना विफल रहता है, क्योंकि पत्रक मानचित्र अभी तक प्रारंभ नहीं हुआ है। मैं कुछ jQuery ज्ञान के साथ शर्त लगाता हूं कि इस चाल को करने की कोई ज़रूरत नहीं है।
यह हल करना कठिन काम रहा है, लेकिन मुझे लगता है कि यह समय के लायक था, अब पत्रक मानचित्रों को कुछ अतिरिक्त उपयोगिता मिली है। इस फिक्स के साथ मजा लें और कृपया पूछें, अगर इसके बारे में कोई सवाल है!
यहां सीमित कारक यह है कि 'पॉपअप' केवल कुछ ऐसा करता है जो स्ट्रिंग को कम करता है। इसका मतलब है कि आप जो भी HTML चाहते हैं उसका उपयोग कर सकते हैं, और यहां तक कि जावास्क्रिप्ट को भी रेखांकित कर सकते हैं, लेकिन आर नहीं, जो बिंदु की तरह है। यदि आप अपने मूल जावास्क्रिप्ट में पुस्तिका के साथ काम करते हैं तो आप शायद आगे जा सकते हैं, लेकिन किसी बिंदु पर यह बेतुका हो जाता है। एक ही जानकारी पेश करने का एक आसान तरीका मार्कर पर एक अलग पैनल प्रतिक्रियाशील बनाना है, ताकि आप आर में अपनी मार्कर-विशिष्ट जानकारी को कोड कर सकें। शायद [इस स्वरूपण] चोरी करें (http://shiny.rstudio.com/ गैलरी/superzip-example.html)। – alistaire
मुझे नहीं पता कि यह अभी भी खुला है, लेकिन क्या आप अपने चमकदार ऐप के साथ एक पुन: उत्पन्न उदाहरण प्रदान कर सकते हैं। – MLavoie
हैलो @ एमएमएवोई, पुनरुत्पादन के लिए कोड मेरे जीथब खाते पर उपलब्ध है (प्रारंभिक पोस्ट देखें, 2 लिंक हैं: जिथब और चमकदार।)। सादर – cho7tom