2015-11-26 6 views
9

Wir möchten ein htmlwidget in einer OpenCPU-Anwendung anzeigen. Das HTML wird von Leaflet ohne Probleme generiert, aber wir haben einige Probleme, es in der OpenCPU-App anzuzeigen. Wir nutzten die folgende Funktion, um die Broschüre Karte zu generieren:Wie HTML-Widgets in OpenCPU-Anwendungen angezeigt werden?

leafmap1 <- function(ecoregion='10105',wdpa_id='1500'){ 
require(leaflet) 
require(shiny) 
require(htmlwidgets) 
m <- leaflet() %>% 
addTiles() %>% # Add default OpenStreetMap map tiles 
addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R") 
m 
} 

Das JavaScript ist wie folgt:

function SochiCtrl($scope){ 
$scope.ecoregions = ['10105'] 
$scope.wdpa_ids = ["1500"] 
$scope.ecoregion = $scope.ecoregions[0] 
$scope.wdpa_id = $scope.wdpa_ids[0]  
$scope.makeChart = function(){ 
    var req = ocpu.rpc("leafmap1", 
    {"ecoregion": $scope.ecoregion, "wdpa_id": $scope.wdpa_id}, function(output){ 
    $('#map').html(output) 
    }).fail(function(text){ 
    alert("Error: " + req.responseText); 
    }); 
} 
$scope.$watchCollection('[ecoregion, wdpa_id]', function(newValues){ 
    console.log(newValues) 
    $scope.makeChart({ecoregion: newValues[0], wdpa_id: newValues[1]}) 
}) 
} 

Nun ist die App zeigt die Broschüre Rahmen, aber ich habe einige Probleme, die json von OpenCPU bekomme ich bekam der folgende Fehler Keine Methode asJSON S3-Klasse: htmlwidget. Ich habe auch versucht mit:

m <- toJSON(m, force= TRUE) 

aber es scheint nicht zu funktionieren.

Der vollständige Code ist verfügbar unter: https://github.com/Arevaju/ocpuleaflet.

Vielen Dank für Ihre Hilfe und herzlichen Glückwunsch für Ihre großartige Arbeit !!

+0

Können Sie einige Beispiel-Code eines Widgets sind Sie anzeigen möchten? – Jeroen

+0

Keine Lösung gefunden? – YCR

+1

Ja, werfen Sie einen Blick auf dieses Repo von Jeroen: https://github.com/opencpu/leafletapp. Sie finden die App auf der OpenCPU-Website. Unser Arbeitsbeispiel finden Sie unter: https://github.com/javimarlop/spdynmodocpu – arevaju

Antwort

1

Entschuldigung, dies ist keine getestete Antwort, aber hier ist es einfacher, einen vorgeschlagenen Ansatz als in einem Kommentar zu erklären.

Was ich vorschlage, ist Ihre Funktion leafmap1, um Klartext (HTML) anstelle des Prospektobjekts zurückzugeben.

Sie können sehen, dass das Leaflet-Objekt die Klasse htmlwidget erbt. Für diese Klasse existiert eine Methode für die generische Funktion toHTML, die das Abrufen eines solchen HTML-Codes ermöglicht.

Angenommene eine Broschüre Objekt:

m = leaflet() %>% addTiles() 

Lassen Sie uns an seiner Klasse einen Blick:

class(m) 
[1] "leaflet" "htmlwidget" 

Holen Sie sich das zugrunde liegende generierten HTML:

> (out <- unclass(htmlwidgets:::toHTML(m))) 
[[1]] 
<div id="htmlwidget-7863" style="width:100%;height:400px;" class="leaflet html-widget"></div> 
[[2]] 
<script type="application/json" data-for="htmlwidget-7863">{"x":{"calls":[{"method":"addTiles","args": ["http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",null,null,{"minZoom":0,"maxZoom":18,"maxNativeZoom":null,"tileSize":256,"subdomains":"abc","errorTileUrl":"","tms":false,"continuousWorld":false,"noWrap":false,"zoomOffset":0,"zoomReverse":false,"opacity":1,"zIndex":null,"unloadInvisibleTiles":null,"updateWhenIdle":null,"detectRetina":false,"reuseTiles":false,"attribution":"&copy; <a href=\"http://openstreetmap.org\">OpenStreetMap\u003c/a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA\u003c/a>"}]}]},"evals":[],"jsHooks":[]}</script> 
[[3]] 
NULL 
attr(,"html_dependencies") 
attr(,"html_dependencies")[[1]] 
[...] 

Dritter Steckplatz enthält Abhängigkeiten (javascript + css), also denke ich, dass diese bereits in Ihrem Bericht geladen sind.

Sie können die Verkettung der ersten beiden Komponenten (Funktionsergebnis) zurück:

return(paste(out[[1]], out[[2]], sep="\n")) 
+0

Schön, aber wie enthalten Sie die HTML in Ihrem Skript? Stört es Sie den js-Anruf auf der Client-Seite genau? – YCR

+0

Ich habe vor Jahren nur einmal mit opencpu gearbeitet. Fügt man in HTML ein div-Element hinzu und hängt das Ergebnis an? Sich als '$ ('# results'). Append ("
");' (gefunden unter http://stackoverflow.com/questions/11418535/how-to-call-an-self-designed-r-function- on-opencpu-via-javascript) –

+0

Sitzung versucht.getObject (Funktion (Outtxt)) \t \t \t $ ("# my_div"). Text (Outtxt); \t \t}); und

und hat nicht funktioniert. Vielleicht auf eine Art, die mir nicht bewusst ist. – YCR

Verwandte Themen